home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / dm3_src.zip / DMBBS.C < prev    next >
C/C++ Source or Header  |  1990-08-02  |  95KB  |  3,164 lines

  1. /* ************************************************************************* */
  2. /*                                                                           */
  3. /*           D O O R W A R E   B B S   F I L E   I N T E R F A C E           */
  4. /*                                                                           */
  5. /*                          For Mycrosoft & Turbo C                          */
  6. /*                                                                           */
  7. /* ************************************************************************* */
  8. /*                                                                           */
  9. /*      This module contains functions used to input access information      */
  10. /*      from the RBBS files.                                                 */
  11. /*                                                                           */
  12. /*      The following funtions are contained in this file:                   */
  13. /*                                                                           */
  14. /*              read_bbs_info   - Read the BBS files                         */
  15. /*              rbbs_read       - Read the RBBS files (16.x +)               */
  16. /*              pcbbs_read      - Read the PC-Board files (12.1)             */
  17. /*              pcbbs2_read     - Read the PC-Board files (14.0)             */
  18. /*              wcbbs_read      - Read the Wildcat files                     */
  19. /*              qbbs_read       - Read the Quick BBS files                   */
  20. /*              gbbs_read       - Read the GAP BBS files                     */
  21. /*              wbbs_read       - Read the WWIV BBS files                    */
  22. /*              page_operator   - Page local operator                        */
  23. /*              chat_mode       - Chat between remote & local                */
  24. /*                                                                           */
  25. /*                                                                           */
  26. /* ************************************************************************* */
  27.  
  28.  
  29.  
  30. /* ************************************************************************* */
  31. /*                            PROGRAM HISTORY                                */
  32. /* ************************************************************************* */
  33. /* 06/20/87     Version 1.00                                                 */
  34. /* 06/14/88     Version 1.10                                                 */
  35. /*              Added Quick BBS support                                      */
  36. /*                                                                           */
  37. /*                                                                           */
  38. /* ************************************************************************* */
  39.  
  40.  
  41.  
  42. #include "dmcfg.h"                              /* Std. defines & includes   */
  43. #include "dmdata.h"                             /* Std DM storage            */
  44.  
  45. static  char    nodeid[37][2] = { "0",
  46.                                   "1",
  47.                                   "2",
  48.                                   "3",
  49.                                   "4",
  50.                                   "5",
  51.                                   "6",
  52.                                   "7",
  53.                                   "8",
  54.                                   "9",
  55.                                   "A",
  56.                                   "B",
  57.                                   "C",
  58.                                   "D",
  59.                                   "E",
  60.                                   "F",
  61.                                   "G",
  62.                                   "H",
  63.                                   "I",
  64.                                   "J",
  65.                                   "K",
  66.                                   "L",
  67.                                   "M",
  68.                                   "N",
  69.                                   "O",
  70.                                   "P",
  71.                                   "Q",
  72.                                   "R",
  73.                                   "S",
  74.                                   "T",
  75.                                   "U",
  76.                                   "V",
  77.                                   "W",
  78.                                   "X",
  79.                                   "Y",
  80.                                   "Z" };
  81.  
  82.  
  83. /******************************************************************************
  84.  *
  85.  * READ_BBS_INFO - Read user infor from BBS files
  86.  *
  87.  * process      1. If running local, exit
  88.  *              2. Open the comm port
  89.  *              3. Exit if error
  90.  *              4. Read appropriate bbs files
  91.  *              5. Exit if bad read
  92.  *              6. Exit
  93.  * input        Node = -1 if local
  94.  *              Else node = BBS node number
  95.  *                   path = Path to BBS files
  96.  *                        = "" if running under RBBS Door Monitor
  97.  *                   type = "RBBS"      if RBBS 16.x, 17.x
  98.  *                        = "QBBS"      if Quick BBS
  99.  *                        = "PCBOARD"   if PC-Board 12.1
  100.  *                        = "PCBOARD14" if PC-Board 14.0
  101.  *                        = "WILDCAT"   if Wildcat
  102.  *                        = "GAP"       if GAP BBS
  103.  *                        = "WWIV"      if WWIV BBS
  104.  *                        = "SPITFIRE   if Spitfire BBS (door)
  105.  *                        = "SPITFIREK  if Spitfire BBS (Main menu user command)
  106.  *                        = "SPITFIREM  if Spitfire BBS (Msg. menu user command)
  107.  *                        = "SPITFIREF  if Spitfire BBS (File menu user command)
  108.  * output       Returns 0  if all ok
  109.  *              ===== Comm Port Return Codes =====
  110.  *              Returns -1 if can't open node file NODES.BBS
  111.  *              Returns -2 if illegal node number in NODES.BBS
  112.  *              Returns -3 if illegal port name in NODES.BBS
  113.  *              Returns -4 if illegal number of parameters in PORTS.BBS
  114.  *              Returns -5 if illegal comm port id in PORTS.BBS
  115.  *              Returns -6 if illegal comm port address in PORTS.BBS
  116.  *              Returns -7 if illegal IRQ number in PORTS.BBS
  117.  *              Returns -8 if illegal INT enable in PORTS.BBS
  118.  *              Returns -9 if illegal handshake in PORTS.BBS
  119.  *              Returns -10 if illegal passthrough in PORTS.BBS
  120.  *              Returns -11 if Duplicate comm port definition in PORTS.BBS
  121.  *              Returns -12 if No defined port ids in PORTS.BBS
  122.  *              Returns -13 if Port is not defined in PORTS.BBS
  123.  *              ===== RBBS 16.x Return Codes =====
  124.  *              Returns -21 if can't find MESSAGES file
  125.  *              Returns -22 if can't read node record
  126.  *              Returns -23 if can't find DORINFOx files
  127.  *              Returns -24 if can't read user record
  128.  *              ===== PC-Board Return Codes =====
  129.  *              Returns -31 if can't find PCBOARD.SYS info
  130.  *              Returns -32 if can't read PCBOARD.SYS info
  131.  *              ===== Wildcat Return Codes =====
  132.  *              Returns -41 if can't find CALLINFO.BBS info
  133.  *              Returns -42 if can't read CALLINFO.BBS info
  134.  *              ===== QBBS Return Codes =====
  135.  *              Returns -51 if can't find DORINFOx.DEF info
  136.  *              Returns -52 if can't read DORINFOx.DEF info
  137.  *              ===== GAP BBS Return Codes =====
  138.  *              Returns -61 if can't find DOOR.SYS info
  139.  *              Returns -62 if can't read DOOR.SYS info
  140.  *              ===== WWIV BBS Return Codes =====
  141.  *              Returns -71 if can't find CHAIN.TXT info
  142.  *              Returns -72 if can't read CHAIN.TXT info
  143.  *              ===== SPITFIRE BBS Return Codes =====
  144.  *              Returns -81 if can't find SFDOORS.DAT info
  145.  *              Returns -82 if can't read SFDOORS.DAT info
  146.  *              Returns -83 if can't find SFMAIN.DAT info
  147.  *              Returns -84 if can't read SFMAIN.DAT info
  148.  *              Returns -85 if can't find SFMESS.DAT info
  149.  *              Returns -86 if can't read SFMESS.DAT info
  150.  *              Returns -87 if can't find SFFILE.DAT info
  151.  *              Returns -88 if can't read SFFILE.DAT info
  152.  *              ===== Door Monitor Return Codes =====
  153.  *              Returns -101 if can't find TIMEOFFx.DOR
  154.  *              Returns -102 if can't find or read NAMES.DOR
  155.  *              ===== Misc Return Codes =====
  156.  *              Returns 1 if bad type parameter
  157.  *****************************************************************************/
  158.  
  159. read_bbs_info(node, path, type)
  160.  
  161. int     node;                                   /* BBS node number           */
  162. char    *path;                                  /* Path to BBS files         */
  163. char    *type;                                  /* BBS identifier            */
  164. {
  165. int     i;
  166.  
  167.  
  168.   /*
  169.    * Store incomming parms
  170.    */
  171.  
  172.    if(node != -1)
  173.    {
  174.      user_node = node;                          /* Save node number          */
  175.  
  176.      if(strlen(path))                           /* If BBS path specified     */
  177.      {
  178.        strcpy(bbs_dir, path);                   /* ...copy it over           */
  179.        if(bbs_dir[strlen(bbs_dir) - 1] != '\\') /* ...if not terminated...   */
  180.          strcat(bbs_dir, "\\");                 /* ......then fix it         */
  181.      }
  182.      else
  183.      {
  184.        strcpy(bbs_dir, "\0");                   /* MWB - running from MON    */
  185.      }
  186.    }
  187.  
  188.  
  189.   /*
  190.    * Open Remote Stream
  191.    */
  192.  
  193.    if(node == -1)
  194.      remote_user = 0;
  195.    else
  196.    {
  197.      i = io_open(node);
  198.  
  199.      if(i)
  200.        return(i);
  201.    }
  202.  
  203.  
  204.   /*
  205.    * Initialize Local Variables
  206.    */
  207.  
  208.    srand(rnd_clock());               /* Set random seed based on clock value */
  209.  
  210.  
  211.   /*
  212.    * Setup player information
  213.    */
  214.  
  215.    if(remote_user)
  216.    {
  217.      if(strlen(path))
  218.      {
  219.        /* Read BBS Files */
  220.  
  221.        if(strlen(type))
  222.        {
  223.          if(strcmp(strupr(type), "SPITFIRE") == 0)
  224.          {
  225.            i = sfbbs_read(node, "SFDOORS.DAT");
  226.            if(i)
  227.              return(i - 80);
  228.          }
  229.          else if(strcmp(strupr(type), "SPITFIREK") == 0)
  230.          {
  231.            i = sfbbs_read(node, "SFMAIN.DAT");
  232.            if(i)
  233.              return(i - 82);
  234.          }
  235.          else if(strcmp(strupr(type), "SPITFIREM") == 0)
  236.          {
  237.            i = sfbbs_read(node, "SFMESS.DAT");
  238.            if(i)
  239.              return(i - 84);
  240.          }
  241.          else if(strcmp(strupr(type), "SPITFIREF") == 0)
  242.          {
  243.            i = sfbbs_read(node, "SFFILE.DAT");
  244.            if(i)
  245.              return(i - 86);
  246.          }
  247.          else if(strcmp(strupr(type), "WWIV") == 0)
  248.          {
  249.            i = wbbs_read(node);
  250.            if(i)
  251.              return(i - 70);
  252.          }
  253.          else if(strcmp(strupr(type), "GAP") == 0)
  254.          {
  255.            i = gbbs_read(node);
  256.            if(i)
  257.              return(i - 60);
  258.          }
  259.          else if(strcmp(strupr(type), "QBBS") == 0)
  260.          {
  261.            i = qbbs_read(node);
  262.            if(i)
  263.              return(i - 50);
  264.          }
  265.          else if(strcmp(strupr(type), "WILDCAT") == 0)
  266.          {
  267.            i = wcbbs_read(node);
  268.            if(i)
  269.              return(i - 40);
  270.          }
  271.          else if(strcmp(strupr(type), "PCBOARD14") == 0)
  272.          {
  273.            i = pcbbs2_read(node);
  274.            if(i)
  275.              return(i - 30);
  276.          }
  277.          else if(strcmp(strupr(type), "PCBOARD") == 0)
  278.          {
  279.            i = pcbbs_read(node);
  280.            if(i)
  281.              return(i - 30);
  282.          }
  283.          else if(strcmp(strupr(type), "RBBS") == 0)
  284.          {
  285. /*         i = rbbs_read(node);         */
  286.            i = qbbs_read(node);
  287.            if(i)
  288.              return(i - 20);
  289.          }
  290.        }
  291.        else
  292.          return(1);
  293.  
  294.  
  295.        if(bbs_node_info.snoop[1] != '1')
  296.        {
  297.          local_cls();
  298.          no_cursor();
  299.        }
  300.      }
  301.      else
  302.      {
  303.        /* Read Monitor Files */
  304.  
  305.        i = mon_read(node);
  306.        if(i)
  307.          return(100 - i);
  308.  
  309.        i = mon_player(user_name, mon_user);
  310.        if(i)
  311.          return(101 - i);
  312.      }
  313.    }
  314.    return(0);
  315. }
  316.  
  317.  
  318. /******************************************************************************
  319.  *
  320.  * RBBS_READ - Read user infor from BBS files
  321.  *
  322.  * process      1. If running local, exit
  323.  *              2. Open MESSAGES file
  324.  *              3. Exit if not found
  325.  *              4. Read appropriate node record
  326.  *              5. Exit if bad read
  327.  *              6. Store users name
  328.  *              7. Store logon time
  329.  *              8. Close file
  330.  *              9. Open DORINFOx file
  331.  *             10. Exit if not found
  332.  *             11. Read user information
  333.  *             12. Close file
  334.  *             13. Store security level
  335.  *             14. Store graphics type
  336.  *             15. Store nulls flag
  337.  *             16. Store caps flag
  338.  *             17. Store page length
  339.  *             18. Store used time
  340.  *             19. Store timelimit
  341.  *             20. Exit
  342.  * input        Node = -1 if no parameters
  343.  *              Else node = BBS node number
  344.  * output       Returns 0 if all ok
  345.  *              Returns -1 if can't find MESSAGES file
  346.  *              Returns -2 if can't read node record
  347.  *              Returns -3 if can't find DORINFOx files
  348.  *              Returns -4 if can't read user record
  349.  *****************************************************************************/
  350.  
  351. rbbs_read(node)
  352.  
  353. int     node;                                   /* BBS node number           */
  354. {
  355. long    lseek();
  356. long    cvt_time();                             /* Convert time string       */
  357. long    cur_time();                             /* Get current time          */
  358.  
  359. FS      rfd;                                    /* File control block        */
  360. long    foffset;                                /* File offset               */
  361.  
  362. int     i, j, k;                                /* Work variables            */
  363. char    string_data[80];                        /* Work space                */
  364.  
  365.    /*
  366.     * Exit if local only
  367.     */
  368.  
  369.    if(remote_user == 0)                         /* If remote not active...   */
  370.      return(0);                                 /* ...exit all ok            */
  371.  
  372.  
  373.    /*
  374.     * Open MESSAGES file
  375.     */
  376.  
  377.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  378.    strcat(rfd.name, "MESSAGES");
  379.  
  380.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open MESSAGES          */
  381.    if(i)                                        /* If file not found...      */
  382.      return(-1);                                /* ...exit with error        */
  383.  
  384.  
  385.    /*
  386.     * Read appropriate node record
  387.     */
  388.  
  389.    if(node == 0)
  390.      foffset = 128L;                            /* Calc location of node rec */
  391.    else
  392.      foffset = node * 128L;                     /* Calc location of node rec */
  393.    lseek(rfd.fh, foffset, 0);                   /* Seek the location         */
  394.    if(read(rfd.fh, &bbs_node_info, 128) != 128) /* If bad read...           */
  395.      return(-2);                                /* ...error                  */
  396.  
  397.    if(strcmp(bbs_node_info.sysop, "-1") == 0)
  398.      remote_user = 0;
  399.  
  400.  
  401.    /*
  402.     * Close file
  403.     */
  404.  
  405.     file_close(&rfd);                           /* Close it                  */
  406.  
  407.  
  408.    /*
  409.     * Open DORINFOx file
  410.     */
  411.  
  412.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  413.    strcat(rfd.name, "DORINFO");
  414.    strcat(rfd.name, nodeid[node]);
  415.    strcat(rfd.name, ".DEF");
  416.  
  417.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open USERS             */
  418.    if(i)                                        /* If file not found...      */
  419.      return(-3);                                /* ...exit with error        */
  420.  
  421.  
  422.    /*
  423.     * Read in the user info
  424.     */
  425.  
  426.    for(i = 0 ; i < 12 ; i++)                    /* Read each line in         */
  427.    {
  428.      if(fgets(ascii_user_info[i], 128, rfd.fd) == NULL)  /* If bad read...    */
  429.      {
  430.        file_close(&rfd);
  431.        return(-4);
  432.      }
  433.    }
  434.  
  435.  
  436.    /*
  437.     * Close file
  438.     */
  439.  
  440.     file_close(&rfd);                           /* close it                  */
  441.  
  442.  
  443.    /*
  444.     * Store users name
  445.     */
  446.  
  447.    i = 0;
  448.    while((i < 31) && (ascii_user_info[6][i] != 0x0d) &&
  449.          (ascii_user_info[6][i] != 0x0a) && (ascii_user_info[6][i] != 0x00))
  450.    {
  451.      bbs_user_info.name[i] = ascii_user_info[6][i];
  452.      user_name[i] = ascii_user_info[6][i];
  453.      i++;
  454.    }
  455.    if(i < 31)
  456.    {
  457.      bbs_user_info.name[i] = ' ';
  458.      user_name[i] = ' ';
  459.      i++;
  460.    }
  461.    j = 0;
  462.    while((i < 31) && (ascii_user_info[7][j] != 0x0d) &&
  463.          (ascii_user_info[7][j] != 0x0a) && (ascii_user_info[7][j] != 0x00))
  464.    {
  465.      bbs_user_info.name[i] = ascii_user_info[7][j];
  466.      user_name[i] = ascii_user_info[7][j];
  467.      i++;
  468.      j++;
  469.    }
  470.    while(i < 31)
  471.    {
  472.      bbs_user_info.name[i] = ' ';
  473.      user_name[i] = ' ';
  474.      i++;
  475.    }
  476.    user_name[i] = 0x00;
  477.  
  478.  
  479.    /*
  480.     * Store security level
  481.     */
  482.  
  483.    bbs_user_info.security = atoi(ascii_user_info[10]);
  484.    user_security  = bbs_user_info.security;
  485.  
  486.  
  487.    /*
  488.     * Store graphics type
  489.     */
  490.  
  491.    user_graphics = atoi(ascii_user_info[9]);
  492.  
  493.  
  494.    /*
  495.     * Store nulls flag
  496.     */
  497.  
  498.    user_nulls = 0;
  499.  
  500.  
  501.    /*
  502.     * Store caps flag
  503.     */
  504.  
  505.    user_caps = 0;
  506.  
  507.  
  508.    /*
  509.     * Store page length
  510.     */
  511.  
  512.    user_page = 23;
  513.  
  514.  
  515.    /*
  516.     * Compute effective login
  517.     */
  518.  
  519.    user_start   = cur_time();                   /* Remeber when we started   */
  520.    user_signon  = cur_time();
  521.  
  522.  
  523.    /*
  524.     * Store timelimit
  525.     */
  526.  
  527.    user_signoff  = atoi(ascii_user_info[11]) * 60L;  /* Compute logoff        */
  528.    user_signoff += user_signon;
  529.  
  530.  
  531.    /*
  532.     * Test for local node
  533.     */
  534.  
  535.     if(strnicmp(ascii_user_info[3], "COM0", 4) == 0)
  536.       remote_user = 0;
  537.  
  538.  
  539.    /*
  540.     * Exit
  541.     */
  542.  
  543.    return(0);                                   /* Exit all ok               */
  544.  
  545. }
  546.  
  547.  
  548. /******************************************************************************
  549.  *
  550.  * QBBS_READ - Read user infor from BBS files
  551.  *
  552.  * process      1. If running local, exit
  553.  *              2. Set default node configuration
  554.  *              3. Open DORINFOx file
  555.  *              4. Exit if not found
  556.  *              5. Read user information
  557.  *              6. Close file
  558.  *              7. Store security level
  559.  *              8. Store graphics type
  560.  *              9. Store nulls flag
  561.  *             10. Store caps flag
  562.  *             11. Store page length
  563.  *             12. Store used time
  564.  *             13. Store timelimit
  565.  *             14. Exit
  566.  * input        Node = -1 if no parameters
  567.  *              Else node = BBS node number
  568.  * output       Returns 0 if all ok
  569.  *              Returns -1 if can't find DORINFOx files
  570.  *              Returns -2 if can't read user record
  571.  *****************************************************************************/
  572.  
  573. qbbs_read(node)
  574.  
  575. int     node;                                   /* BBS node number           */
  576. {
  577. long    cvt_time();                             /* Convert time string       */
  578. long    cur_time();                             /* Get current time          */
  579.  
  580. FS      rfd;                                    /* File control block        */
  581. long    foffset;                                /* File offset               */
  582.  
  583. int     i, j, k;                                /* Work variables            */
  584. char    string_data[80];                        /* Work space                */
  585.  
  586.    /*
  587.     * Exit if local only
  588.     */
  589.  
  590.    if(remote_user == 0)                         /* If remote not active...   */
  591.      return(0);                                 /* ...exit all ok            */
  592.  
  593.  
  594.    /*
  595.     * Open DORINFOx file
  596.     */
  597.  
  598.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  599.    strcat(rfd.name, "DORINFO");
  600.    strcat(rfd.name, nodeid[node]);
  601.    strcat(rfd.name, ".DEF");
  602.  
  603.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open USERS             */
  604.    if(i)                                        /* If file not found...      */
  605.      return(-1);                                /* ...exit with error        */
  606.  
  607.  
  608.    /*
  609.     * Read in the user info
  610.     */
  611.  
  612.    for(i = 0 ; i < 12 ; i++)                    /* Read each line in         */
  613.    {
  614.      if(fgets(ascii_user_info[i], 128, rfd.fd) == NULL)  /* If bad read...    */
  615.      {
  616.        file_close(&rfd);
  617.        return(-2);
  618.      }
  619.    }
  620.  
  621.  
  622.    /*
  623.     * Close file
  624.     */
  625.  
  626.     file_close(&rfd);                           /* close it                  */
  627.  
  628.  
  629.    /*
  630.     * Set bbs node parameters to defaults
  631.     */
  632.  
  633.    bbs_node_info.snoop[0]        = '-';
  634.    bbs_node_info.snoop[1]        = '1';
  635.    bbs_node_info.line_printer[0] = ' ';
  636.    bbs_node_info.line_printer[1] = '0';
  637.    bbs_node_info.sysop_avail[0]  = '-';
  638.    bbs_node_info.sysop_avail[1]  = '1';
  639.    bbs_user_info.options.bit_flags = BBS_OPTION_BELL;
  640.    bbs_node_info.sysop_next[0]   = ' ';
  641.    bbs_node_info.sysop_next[1]   = '0';
  642.    bbs_node_info.baud_rate[0]    = '-';
  643.    bbs_node_info.baud_rate[1]    = '3';
  644.    bbs_node_info.baud_dial[0]    = '-';
  645.    bbs_node_info.baud_dial[1]    = '3';
  646.    bbs_node_info.sysop_annoy[0]  = ' ';
  647.    bbs_node_info.sysop_annoy[1]  = '0';
  648.    bbs_node_info.doors_avail[0]  = '-';
  649.    bbs_node_info.doors_avail[1]  = '1';
  650.    bbs_node_info.eight_bits[0]   = '-';
  651.    bbs_node_info.eight_bits[1]   = '1';
  652.    bbs_node_info.upper_case[0]   = ' ';
  653.    bbs_node_info.upper_case[1]   = '0';
  654.    bbs_node_info.reserve_1[0]    = ' ';
  655.    bbs_node_info.reserve_1[1]    = ' ';
  656.    bbs_node_info.reserve_1[2]    = ' ';
  657.    bbs_node_info.reserve_1[3]    = ' ';
  658.    bbs_node_info.reserve_1[4]    = ' ';
  659.    bbs_node_info.sysop[0]        = ' ';
  660.    bbs_node_info.sysop[1]        = '0';
  661.    bbs_node_info.active[0]       = 'A';
  662.    bbs_node_info.reserved_2[0]   = ' ';
  663.    bbs_node_info.reserved_2[1]   = ' ';
  664.    bbs_node_info.reserved_3[0]   = ' ';
  665.    bbs_node_info.reserved_3[1]   = ' ';
  666.    bbs_node_info.reserved_3[2]   = ' ';
  667.    bbs_node_info.private_door[0] = ' ';
  668.    bbs_node_info.private_door[1] = '0';
  669.    bbs_node_info.transfer[0]     = ' ';
  670.    bbs_node_info.transfer[1]     = ' ';
  671.    strncpy(bbs_node_info.daily_exit_date, "01-01-1987", 10);
  672.    strncpy(bbs_node_info.daily_exit_time, "01:00", 5);
  673.    bbs_node_info.reliable[0]     = '-';
  674.    bbs_node_info.reliable[1]     = '1';
  675.    for(i = 0 ; i < 36 ; i++)
  676.      bbs_node_info.reserved_4[i] = ' ';
  677.  
  678.  
  679.    /*
  680.     * Store users name
  681.     */
  682.  
  683.    i = 0;
  684.    while((i < 31) && (ascii_user_info[6][i] != 0x0d) &&
  685.          (ascii_user_info[6][i] != 0x0a) && (ascii_user_info[6][i] != 0x00))
  686.    {
  687.      bbs_user_info.name[i] = ascii_user_info[6][i];
  688.      user_name[i] = ascii_user_info[6][i];
  689.      i++;
  690.    }
  691.    if(i < 31)
  692.    {
  693.      bbs_user_info.name[i] = ' ';
  694.      user_name[i] = ' ';
  695.      i++;
  696.    }
  697.    j = 0;
  698.    while((i < 31) && (ascii_user_info[7][j] != 0x0d) &&
  699.          (ascii_user_info[7][j] != 0x0a) && (ascii_user_info[7][j] != 0x00))
  700.    {
  701.      bbs_user_info.name[i] = ascii_user_info[7][j];
  702.      user_name[i] = ascii_user_info[7][j];
  703.      i++;
  704.      j++;
  705.    }
  706.    while(i < 31)
  707.    {
  708.      bbs_user_info.name[i] = ' ';
  709.      user_name[i] = ' ';
  710.      i++;
  711.    }
  712.    user_name[i] = 0x00;
  713.  
  714.  
  715.    /*
  716.     * Store security level
  717.     */
  718.  
  719.    bbs_user_info.security = atoi(ascii_user_info[10]);
  720.    user_security  = bbs_user_info.security;
  721.  
  722.  
  723.    /*
  724.     * Store graphics type
  725.     */
  726.  
  727.    bbs_user_info.options.graphics[0] = ascii_user_info[9][0];
  728.    string_data[0] = bbs_user_info.options.graphics[0]; /* Convert to number  */
  729.    string_data[1] = '\0';
  730.    user_graphics  = atoi(string_data);
  731.  
  732.  
  733.    /*
  734.     * Store nulls flag
  735.     */
  736.  
  737.    user_nulls = 0;
  738.  
  739.  
  740.    /*
  741.     * Store caps flag
  742.     */
  743.  
  744.    user_caps = 0;
  745.  
  746.  
  747.    /*
  748.     * Store page length
  749.     */
  750.  
  751.    user_page = 23;
  752.  
  753.  
  754.    /*
  755.     * Compute effective login
  756.     */
  757.  
  758.    user_start   = cur_time();                   /* Remeber when we started   */
  759.    user_signon  = cur_time();
  760.  
  761.  
  762.    /*
  763.     * Store timelimit
  764.     */
  765.  
  766.    user_signoff  = atoi(ascii_user_info[11]) * 60L;  /* Compute logoff        */
  767.    user_signoff += user_signon;
  768.  
  769.  
  770.    /*
  771.     * Test for local node
  772.     */
  773.  
  774.     if(strnicmp(ascii_user_info[3], "COM0", 4) == 0)
  775.       remote_user = 0;
  776.  
  777.  
  778.    /*
  779.     * Exit
  780.     */
  781.  
  782.    return(0);                                   /* Exit all ok               */
  783.  
  784. }
  785.  
  786.  
  787. /******************************************************************************
  788.  *
  789.  * PCBBS_READ - Read user infor from PC-BOARD files
  790.  *
  791.  * process      1. If running local, exit
  792.  *              2. Open PCBOARD.SYS file
  793.  *              3. Exit if not found
  794.  *              4. Read user record
  795.  *              5. Exit if bad read
  796.  *              6. Store users name
  797.  *              7. Store logon time
  798.  *              8. Store security level
  799.  *              9. Store graphics type
  800.  *             10. Store nulls flag
  801.  *             11. Store caps flag
  802.  *             12. Store page length
  803.  *             13. Store used time
  804.  *             14. Store timelimit
  805.  *             15. Close file
  806.  *             16. Exit
  807.  * input        Node = -1 if no parameters
  808.  *              Else node = BBS node number
  809.  * output       Returns 0 if all ok
  810.  *              Returns -1 if can't find PCBOARD.SYS info
  811.  *              Returns -2 if can't read PCBOARD.SYS info
  812.  *****************************************************************************/
  813.  
  814. pcbbs_read(node)
  815.  
  816. int     node;                                   /* BBS node number           */
  817. {
  818. long    lseek();
  819. long    cvt_time();                             /* Convert time string       */
  820. long    cur_time();                             /* Get current time          */
  821.  
  822. FS      rfd;                                    /* File control block        */
  823. long    foffset;                                /* File offset               */
  824.  
  825. int     i, j, k;                                /* Work variables            */
  826. char    string_data[80];                        /* Work space                */
  827.  
  828.    /*
  829.     * Exit if local only
  830.     */
  831.  
  832.    if(remote_user == 0)                         /* If remote not active...   */
  833.      return(0);                                 /* ...exit all ok            */
  834.  
  835.  
  836.    /*
  837.     * Open PCBOARD.SYS file
  838.     */
  839.  
  840.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  841.    strcat(rfd.name, "PCBOARD.SYS");
  842.  
  843.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open the file          */
  844.    if(i)                                        /* If file not found...      */
  845.      return(-1);                                /* ...exit with error        */
  846.  
  847.  
  848.    /*
  849.     * Read user node record
  850.     */
  851.  
  852.    lseek(rfd.fh, 0L, 0);                        /* Seek the location         */
  853.    if(read(rfd.fh, &pcbbs_user_info, 128) != 128) /* If bad read...      */
  854.      return(-2);                                /* ...error                  */
  855.  
  856.  
  857.    /*
  858.     * Copy parms to RBBS structures
  859.     */
  860.  
  861.    bbs_node_info.snoop[0] = pcbbs_user_info.display[0];
  862.    bbs_node_info.snoop[1] = pcbbs_user_info.display[1];
  863.    bbs_node_info.line_printer[0] = pcbbs_user_info.printer[0];
  864.    bbs_node_info.line_printer[1] = pcbbs_user_info.printer[1];
  865.    bbs_node_info.sysop_avail[0] = pcbbs_user_info.page_bell[0];
  866.    bbs_node_info.sysop_avail[1] = pcbbs_user_info.page_bell[1];
  867.  
  868.    if(strncmp(pcbbs_user_info.caller_alarm, " 0", 2) == 0)
  869.      bbs_user_info.options.bit_flags = 0;
  870.    else
  871.      bbs_user_info.options.bit_flags = BBS_OPTION_BELL;
  872.  
  873.    bbs_node_info.sysop_next[0] = pcbbs_user_info.sysop_next[0];
  874.    bbs_node_info.sysop_next[1] = pcbbs_user_info.sysop_next[1];
  875.  
  876.    if(strncmp(pcbbs_user_info.bps, " 300", 4) == 0)
  877.    {
  878.      bbs_node_info.baud_rate[0] = '-';
  879.      bbs_node_info.baud_rate[1] = '1';
  880.      bbs_node_info.baud_dial[0] = '-';
  881.      bbs_node_info.baud_dial[1] = '1';
  882.    }
  883.    else if(strncmp(pcbbs_user_info.bps, "0300", 4) == 0)
  884.    {
  885.      bbs_node_info.baud_rate[0] = '-';
  886.      bbs_node_info.baud_rate[1] = '1';
  887.      bbs_node_info.baud_dial[0] = '-';
  888.      bbs_node_info.baud_dial[1] = '1';
  889.    }
  890.    else if(strncmp(pcbbs_user_info.bps, " 450", 4) == 0)
  891.    {
  892.      bbs_node_info.baud_rate[0] = '-';
  893.      bbs_node_info.baud_rate[1] = '2';
  894.      bbs_node_info.baud_dial[0] = '-';
  895.      bbs_node_info.baud_dial[1] = '2';
  896.    }
  897.    else if(strncmp(pcbbs_user_info.bps, "0450", 4) == 0)
  898.    {
  899.      bbs_node_info.baud_rate[0] = '-';
  900.      bbs_node_info.baud_rate[1] = '2';
  901.      bbs_node_info.baud_dial[0] = '-';
  902.      bbs_node_info.baud_dial[1] = '2';
  903.    }
  904.    else if(strncmp(pcbbs_user_info.bps, "1200", 4) == 0)
  905.    {
  906.      bbs_node_info.baud_rate[0] = '-';
  907.      bbs_node_info.baud_rate[1] = '3';
  908.      bbs_node_info.baud_dial[0] = '-';
  909.      bbs_node_info.baud_dial[1] = '3';
  910.    }
  911.    else if(strncmp(pcbbs_user_info.bps, "2400", 4) == 0)
  912.    {
  913.      bbs_node_info.baud_rate[0] = '-';
  914.      bbs_node_info.baud_rate[1] = '4';
  915.      bbs_node_info.baud_dial[0] = '-';
  916.      bbs_node_info.baud_dial[1] = '4';
  917.    }
  918.    else if(strncmp(pcbbs_user_info.bps, "4800", 4) == 0)
  919.    {
  920.      bbs_node_info.baud_rate[0] = '-';
  921.      bbs_node_info.baud_rate[1] = '5';
  922.      bbs_node_info.baud_dial[0] = '-';
  923.      bbs_node_info.baud_dial[1] = '5';
  924.    }
  925.    else if(strncmp(pcbbs_user_info.bps, "9600", 4) == 0)
  926.    {
  927.      bbs_node_info.baud_rate[0] = '-';
  928.      bbs_node_info.baud_rate[1] = '6';
  929.      bbs_node_info.baud_dial[0] = '-';
  930.      bbs_node_info.baud_dial[1] = '6';
  931.    }
  932.    else
  933.    {
  934.      bbs_node_info.baud_rate[0] = '-';
  935.      bbs_node_info.baud_rate[1] = '3';
  936.      bbs_node_info.baud_dial[0] = '-';
  937.      bbs_node_info.baud_dial[1] = '3';
  938.    }
  939.  
  940.    i = 0;
  941.    while((i < 27) && (pcbbs_user_info.name[i] != 0x0d) &&
  942.          (pcbbs_user_info.name[i] != 0x0a) && (pcbbs_user_info.name[i] != 0x00))
  943.    {
  944.      bbs_node_info.name[i] = pcbbs_user_info.name[i];
  945.      bbs_user_info.name[i] = pcbbs_user_info.name[i];
  946.      i++;
  947.    }
  948.    while(i < 31)
  949.    {
  950.      bbs_node_info.name[i] = ' ';
  951.      bbs_user_info.name[i] = ' ';
  952.      i++;
  953.    }
  954.    bbs_node_info.name[i] = '\0';
  955.    bbs_user_info.name[i] = '\0';
  956.  
  957.    if(strncmp(pcbbs_user_info.graphics, " 0", 2) == 0)
  958.    {
  959.      bbs_node_info.graphics_type[0] = ' ';
  960.      bbs_node_info.graphics_type[0] = '0';
  961.      bbs_user_info.options.graphics[0] = '0';
  962.    }
  963.    else
  964.    {
  965.      bbs_node_info.graphics_type[0] = ' ';
  966.      bbs_node_info.graphics_type[0] = '2';
  967.      bbs_user_info.options.graphics[0] = '2';
  968.    }
  969.  
  970.    for(i = 0 ; i < 12 ; i++)
  971.      bbs_user_info.password[i] = pcbbs_user_info.password[i];
  972.    bbs_user_info.password[i] = '\0';
  973.  
  974.    user_start    = cur_time();
  975.    user_signon   = pcbbs_user_info.connect_time;
  976.    user_signoff  = pcbbs_user_info.max_time;
  977.    user_signoff += user_signon;
  978.  
  979.    bbs_node_info.login_time[0] = pcbbs_user_info.logon[0];
  980.    bbs_node_info.login_time[1] = pcbbs_user_info.logon[1];
  981.    bbs_node_info.login_time[2] = pcbbs_user_info.logon[3];
  982.    bbs_node_info.login_time[3] = pcbbs_user_info.logon[4];
  983.    bbs_node_info.login_time[4] = '0';
  984.    bbs_node_info.login_time[5] = '0';
  985.  
  986.  
  987.    /*
  988.     * Fill unsuplied parms to RBBS structures
  989.     */
  990.  
  991.    bbs_node_info.sysop_annoy[0] = ' ';
  992.    bbs_node_info.sysop_annoy[1] = '0';
  993.    bbs_node_info.doors_avail[0] = '-';
  994.    bbs_node_info.doors_avail[1] = '1';
  995.    bbs_node_info.eight_bits[0] = '-';
  996.    bbs_node_info.eight_bits[1] = '1';
  997.    bbs_node_info.upper_case[0] = ' ';
  998.    bbs_node_info.upper_case[1] = '0';
  999.    bbs_node_info.reserve_1[0] = ' ';
  1000.    bbs_node_info.reserve_1[1] = ' ';
  1001.    bbs_node_info.reserve_1[2] = ' ';
  1002.    bbs_node_info.reserve_1[3] = ' ';
  1003.    bbs_node_info.reserve_1[4] = ' ';
  1004.    bbs_node_info.sysop[0] = ' ';
  1005.    bbs_node_info.sysop[1] = '0';
  1006.    bbs_node_info.active[0] = 'A';
  1007.    bbs_node_info.reserved_2[0] = ' ';
  1008.    bbs_node_info.reserved_2[1] = ' ';
  1009.    bbs_node_info.reserved_3[0] = ' ';
  1010.    bbs_node_info.reserved_3[1] = ' ';
  1011.    bbs_node_info.reserved_3[2] = ' ';
  1012.    bbs_node_info.private_door[0] = ' ';
  1013.    bbs_node_info.private_door[1] = '0';
  1014.    bbs_node_info.transfer[0] = ' ';
  1015.    bbs_node_info.transfer[1] = ' ';
  1016.    strncpy(bbs_node_info.daily_exit_date, "01-01-1987", 10);
  1017.    strncpy(bbs_node_info.daily_exit_time, "01:00", 5);
  1018.    bbs_node_info.reliable[0] = '-';
  1019.    bbs_node_info.reliable[1] = '1';
  1020.    for(i = 0 ; i < 36 ; i++)
  1021.      bbs_node_info.reserved_4[i] = ' ';
  1022.  
  1023.  
  1024.    bbs_user_info.security = 100;
  1025.    bbs_user_info.options.logins = 2;
  1026.    bbs_user_info.options.last_msg = 0;
  1027.    bbs_user_info.options.protocol[0] = ' ';
  1028.    bbs_user_info.options.margins = 0;
  1029.    bbs_user_info.options.subscription = 0;
  1030.    bbs_user_info.options.page_length = 23;
  1031.    bbs_user_info.options.reserved[0] = ' ';
  1032.    for(i = 0 ; i < 24 ; i++)
  1033.      bbs_user_info.residence[i] = ' ';
  1034.    for(i = 0 ; i < 19 ; i++)
  1035.      bbs_user_info.reserved[i] = ' ';
  1036.    strncpy(bbs_user_info.last_on, "01-01-87 01:00", 14);
  1037.    for(i = 0 ; i < 3 ; i++)
  1038.      bbs_user_info.last_dir[i] = '\0';
  1039.    bbs_user_info.downloads = 0;
  1040.    bbs_user_info.uploads = 0;
  1041.    bbs_user_info.elapsed = 0;
  1042.  
  1043.  
  1044.    /*
  1045.     * Store users name
  1046.     */
  1047.  
  1048.     for(i = 0 ; i < 31 ; i++)                   /* Copy all 31 chars         */
  1049.       user_name[i] = bbs_node_info.name[i];
  1050.     user_name[31] = '\0';                       /* Null terminate it         */
  1051.  
  1052.  
  1053.    /*
  1054.     * Close file
  1055.     */
  1056.  
  1057.     file_close(&rfd);                           /* Close it                  */
  1058.  
  1059.  
  1060.    /*
  1061.     * Store security level
  1062.     */
  1063.  
  1064.    user_security  = bbs_user_info.security;
  1065.  
  1066.  
  1067.    /*
  1068.     * Store graphics type
  1069.     */
  1070.  
  1071.    string_data[0] = bbs_user_info.options.graphics[0]; /* Convert to number  */
  1072.    string_data[1] = '\0';
  1073.    user_graphics  = atoi(string_data);
  1074.  
  1075.  
  1076.    /*
  1077.     * Store nulls flag
  1078.     */
  1079.  
  1080.    if(bbs_user_info.options.bit_flags & BBS_OPTION_NULLS)
  1081.      user_nulls = 8;
  1082.    else
  1083.      user_nulls = 0;
  1084.  
  1085.  
  1086.    /*
  1087.     * Store caps flag
  1088.     */
  1089.  
  1090.    if(bbs_user_info.options.bit_flags & BBS_OPTION_CASE)
  1091.      user_caps = 1;
  1092.    else
  1093.      user_caps = 0;
  1094.  
  1095.  
  1096.    /*
  1097.     * Store page length
  1098.     */
  1099.  
  1100.    user_page = bbs_user_info.options.page_length;
  1101.  
  1102.  
  1103.    /*
  1104.     * Store timelimit
  1105.     */
  1106.  
  1107.    user_start   = cur_time();                   /* Remeber when we started   */
  1108.  
  1109.  
  1110.    /*
  1111.     * Exit
  1112.     */
  1113.  
  1114.    return(0);                                   /* Exit all ok               */
  1115.  
  1116. }
  1117.  
  1118.  
  1119. /******************************************************************************
  1120.  *
  1121.  * PCBBS2_READ - Read user infor from PC-BOARD files
  1122.  *
  1123.  * process      1. If running local, exit
  1124.  *              2. Open PCBOARD.SYS file
  1125.  *              3. Exit if not found
  1126.  *              4. Read user record
  1127.  *              5. Exit if bad read
  1128.  *              6. Store users name
  1129.  *              7. Store logon time
  1130.  *              8. Store security level
  1131.  *              9. Store graphics type
  1132.  *             10. Store nulls flag
  1133.  *             11. Store caps flag
  1134.  *             12. Store page length
  1135.  *             13. Store used time
  1136.  *             14. Store timelimit
  1137.  *             15. Close file
  1138.  *             16. Exit
  1139.  * input        Node = -1 if no parameters
  1140.  *              Else node = BBS node number
  1141.  * output       Returns 0 if all ok
  1142.  *              Returns -1 if can't find PCBOARD.SYS info
  1143.  *              Returns -2 if can't read PCBOARD.SYS info
  1144.  *****************************************************************************/
  1145.  
  1146. pcbbs2_read(node)
  1147.  
  1148. int     node;                                   /* BBS node number           */
  1149. {
  1150. long    lseek();
  1151. long    cvt_time();                             /* Convert time string       */
  1152. long    cur_time();                             /* Get current time          */
  1153.  
  1154. FS      rfd;                                    /* File control block        */
  1155. long    foffset;                                /* File offset               */
  1156.  
  1157. int     i, j, k;                                /* Work variables            */
  1158. char    string_data[80];                        /* Work space                */
  1159.  
  1160.    /*
  1161.     * Exit if local only
  1162.     */
  1163.  
  1164.    if(remote_user == 0)                         /* If remote not active...   */
  1165.      return(0);                                 /* ...exit all ok            */
  1166.  
  1167.  
  1168.    /*
  1169.     * Open PCBOARD.SYS file
  1170.     */
  1171.  
  1172.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  1173.    strcat(rfd.name, "PCBOARD.SYS");
  1174.  
  1175.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open the file          */
  1176.    if(i)                                        /* If file not found...      */
  1177.      return(-1);                                /* ...exit with error        */
  1178.  
  1179.  
  1180.    /*
  1181.     * Read user node record
  1182.     */
  1183.  
  1184.    lseek(rfd.fh, 0L, 0);                        /* Seek the location         */
  1185.    if(read(rfd.fh, &pcbbs2_user_info, 128) != 128) /* If bad read...      */
  1186.      return(-2);                                /* ...error                  */
  1187.  
  1188.  
  1189.    /*
  1190.     * Copy parms to RBBS structures
  1191.     */
  1192.  
  1193.    bbs_node_info.snoop[0] = pcbbs2_user_info.display[0];
  1194.    bbs_node_info.snoop[1] = pcbbs2_user_info.display[1];
  1195.    bbs_node_info.line_printer[0] = pcbbs2_user_info.printer[0];
  1196.    bbs_node_info.line_printer[1] = pcbbs2_user_info.printer[1];
  1197.    bbs_node_info.sysop_avail[0] = pcbbs2_user_info.page_bell[0];
  1198.    bbs_node_info.sysop_avail[1] = pcbbs2_user_info.page_bell[1];
  1199.  
  1200.    if(strncmp(pcbbs2_user_info.caller_alarm, " 0", 2) == 0)
  1201.      bbs_user_info.options.bit_flags = 0;
  1202.    else
  1203.      bbs_user_info.options.bit_flags = BBS_OPTION_BELL;
  1204.  
  1205.    if(pcbbs2_user_info.sysop_next == '0')
  1206.      bbs_node_info.sysop_next[0] = ' ';
  1207.    else
  1208.      bbs_node_info.sysop_next[0] = '-';
  1209.    bbs_node_info.sysop_next[1] = pcbbs2_user_info.sysop_next;
  1210.  
  1211.    if(strnicmp(pcbbs2_user_info.bps, "LOCAL", 5) == 0)
  1212.    {
  1213.      remote_user = 0;
  1214.    }
  1215.    else if(strncmp(pcbbs2_user_info.bps, "  300", 5) == 0)
  1216.    {
  1217.      bbs_node_info.baud_rate[0] = '-';
  1218.      bbs_node_info.baud_rate[1] = '1';
  1219.      bbs_node_info.baud_dial[0] = '-';
  1220.      bbs_node_info.baud_dial[1] = '1';
  1221.    }
  1222.    else if(strncmp(pcbbs2_user_info.bps, " 0300", 5) == 0)
  1223.    {
  1224.      bbs_node_info.baud_rate[0] = '-';
  1225.      bbs_node_info.baud_rate[1] = '1';
  1226.      bbs_node_info.baud_dial[0] = '-';
  1227.      bbs_node_info.baud_dial[1] = '1';
  1228.    }
  1229.    else if(strncmp(pcbbs2_user_info.bps, "00300", 5) == 0)
  1230.    {
  1231.      bbs_node_info.baud_rate[0] = '-';
  1232.      bbs_node_info.baud_rate[1] = '1';
  1233.      bbs_node_info.baud_dial[0] = '-';
  1234.      bbs_node_info.baud_dial[1] = '1';
  1235.    }
  1236.    else if(strncmp(pcbbs2_user_info.bps, "  450", 5) == 0)
  1237.    {
  1238.      bbs_node_info.baud_rate[0] = '-';
  1239.      bbs_node_info.baud_rate[1] = '2';
  1240.      bbs_node_info.baud_dial[0] = '-';
  1241.      bbs_node_info.baud_dial[1] = '2';
  1242.    }
  1243.    else if(strncmp(pcbbs2_user_info.bps, " 0450", 5) == 0)
  1244.    {
  1245.      bbs_node_info.baud_rate[0] = '-';
  1246.      bbs_node_info.baud_rate[1] = '2';
  1247.      bbs_node_info.baud_dial[0] = '-';
  1248.      bbs_node_info.baud_dial[1] = '2';
  1249.    }
  1250.    else if(strncmp(pcbbs2_user_info.bps, "00450", 5) == 0)
  1251.    {
  1252.      bbs_node_info.baud_rate[0] = '-';
  1253.      bbs_node_info.baud_rate[1] = '2';
  1254.      bbs_node_info.baud_dial[0] = '-';
  1255.      bbs_node_info.baud_dial[1] = '2';
  1256.    }
  1257.    else if(strncmp(pcbbs2_user_info.bps, " 1200", 5) == 0)
  1258.    {
  1259.      bbs_node_info.baud_rate[0] = '-';
  1260.      bbs_node_info.baud_rate[1] = '3';
  1261.      bbs_node_info.baud_dial[0] = '-';
  1262.      bbs_node_info.baud_dial[1] = '3';
  1263.    }
  1264.    else if(strncmp(pcbbs2_user_info.bps, "01200", 5) == 0)
  1265.    {
  1266.      bbs_node_info.baud_rate[0] = '-';
  1267.      bbs_node_info.baud_rate[1] = '3';
  1268.      bbs_node_info.baud_dial[0] = '-';
  1269.      bbs_node_info.baud_dial[1] = '3';
  1270.    }
  1271.    else if(strncmp(pcbbs2_user_info.bps, " 2400", 5) == 0)
  1272.    {
  1273.      bbs_node_info.baud_rate[0] = '-';
  1274.      bbs_node_info.baud_rate[1] = '4';
  1275.      bbs_node_info.baud_dial[0] = '-';
  1276.      bbs_node_info.baud_dial[1] = '4';
  1277.    }
  1278.    else if(strncmp(pcbbs2_user_info.bps, "02400", 5) == 0)
  1279.    {
  1280.      bbs_node_info.baud_rate[0] = '-';
  1281.      bbs_node_info.baud_rate[1] = '4';
  1282.      bbs_node_info.baud_dial[0] = '-';
  1283.      bbs_node_info.baud_dial[1] = '4';
  1284.    }
  1285.    else if(strncmp(pcbbs2_user_info.bps, " 4800", 5) == 0)
  1286.    {
  1287.      bbs_node_info.baud_rate[0] = '-';
  1288.      bbs_node_info.baud_rate[1] = '5';
  1289.      bbs_node_info.baud_dial[0] = '-';
  1290.      bbs_node_info.baud_dial[1] = '5';
  1291.    }
  1292.    else if(strncmp(pcbbs2_user_info.bps, "04800", 5) == 0)
  1293.    {
  1294.      bbs_node_info.baud_rate[0] = '-';
  1295.      bbs_node_info.baud_rate[1] = '5';
  1296.      bbs_node_info.baud_dial[0] = '-';
  1297.      bbs_node_info.baud_dial[1] = '5';
  1298.    }
  1299.    else if(strncmp(pcbbs2_user_info.bps, " 9600", 5) == 0)
  1300.    {
  1301.      bbs_node_info.baud_rate[0] = '-';
  1302.      bbs_node_info.baud_rate[1] = '6';
  1303.      bbs_node_info.baud_dial[0] = '-';
  1304.      bbs_node_info.baud_dial[1] = '6';
  1305.    }
  1306.    else if(strncmp(pcbbs2_user_info.bps, "09600", 5) == 0)
  1307.    {
  1308.      bbs_node_info.baud_rate[0] = '-';
  1309.      bbs_node_info.baud_rate[1] = '6';
  1310.      bbs_node_info.baud_dial[0] = '-';
  1311.      bbs_node_info.baud_dial[1] = '6';
  1312.    }
  1313.    else if(strncmp(pcbbs2_user_info.bps, "19200", 5) == 0)
  1314.    {
  1315.      bbs_node_info.baud_rate[0] = '-';
  1316.      bbs_node_info.baud_rate[1] = '7';
  1317.      bbs_node_info.baud_dial[0] = '-';
  1318.      bbs_node_info.baud_dial[1] = '7';
  1319.    }
  1320.    else if(strncmp(pcbbs2_user_info.bps, "38400", 5) == 0)
  1321.    {
  1322.      bbs_node_info.baud_rate[0] = '-';
  1323.      bbs_node_info.baud_rate[1] = '8';
  1324.      bbs_node_info.baud_dial[0] = '-';
  1325.      bbs_node_info.baud_dial[1] = '8';
  1326.    }
  1327.    else
  1328.    {
  1329.      bbs_node_info.baud_rate[0] = '-';
  1330.      bbs_node_info.baud_rate[1] = '3';
  1331.      bbs_node_info.baud_dial[0] = '-';
  1332.      bbs_node_info.baud_dial[1] = '3';
  1333.    }
  1334.  
  1335.    i = 0;
  1336.    while((i < 25) && (pcbbs2_user_info.name[i] != 0x0d) &&
  1337.          (pcbbs2_user_info.name[i] != 0x0a) && (pcbbs2_user_info.name[i] != 0x00))
  1338.    {
  1339.      bbs_node_info.name[i] = pcbbs2_user_info.name[i];
  1340.      bbs_user_info.name[i] = pcbbs2_user_info.name[i];
  1341.      i++;
  1342.    }
  1343.    while(i < 31)
  1344.    {
  1345.      bbs_node_info.name[i] = ' ';
  1346.      bbs_user_info.name[i] = ' ';
  1347.      i++;
  1348.    }
  1349.  
  1350.    bbs_node_info.name[i] = '\0';
  1351.    bbs_user_info.name[i] = '\0';
  1352.  
  1353.    if(pcbbs2_user_info.graphics == '0')
  1354.    {
  1355.      bbs_node_info.graphics_type[0] = ' ';
  1356.      bbs_node_info.graphics_type[0] = '0';
  1357.      bbs_user_info.options.graphics[0] = '0';
  1358.    }
  1359.    else
  1360.    {
  1361.      bbs_node_info.graphics_type[0] = ' ';
  1362.      bbs_node_info.graphics_type[0] = '2';
  1363.      bbs_user_info.options.graphics[0] = '2';
  1364.    }
  1365.  
  1366.    for(i = 0 ; i < 12 ; i++)
  1367.      bbs_user_info.password[i] = pcbbs2_user_info.password[i];
  1368.    bbs_user_info.password[i] = '\0';
  1369.  
  1370.    user_start    = cur_time();
  1371.    user_signon   = cur_time();
  1372.    user_signoff  = pcbbs2_user_info.time_left;
  1373.    user_signoff *= 60L;
  1374.    user_signoff += user_signon;
  1375.  
  1376.    bbs_node_info.login_time[0] = pcbbs2_user_info.logon[0];
  1377.    bbs_node_info.login_time[1] = pcbbs2_user_info.logon[1];
  1378.    bbs_node_info.login_time[2] = pcbbs2_user_info.logon[3];
  1379.    bbs_node_info.login_time[3] = pcbbs2_user_info.logon[4];
  1380.    bbs_node_info.login_time[4] = '0';
  1381.    bbs_node_info.login_time[5] = '0';
  1382.  
  1383.  
  1384.    /*
  1385.     * Fill unsuplied parms to RBBS structures
  1386.     */
  1387.  
  1388.    bbs_node_info.sysop_annoy[0] = ' ';
  1389.    bbs_node_info.sysop_annoy[1] = '0';
  1390.    bbs_node_info.doors_avail[0] = '-';
  1391.    bbs_node_info.doors_avail[1] = '1';
  1392.    bbs_node_info.eight_bits[0] = '-';
  1393.    bbs_node_info.eight_bits[1] = '1';
  1394.    bbs_node_info.upper_case[0] = ' ';
  1395.    bbs_node_info.upper_case[1] = '0';
  1396.    bbs_node_info.reserve_1[0] = ' ';
  1397.    bbs_node_info.reserve_1[1] = ' ';
  1398.    bbs_node_info.reserve_1[2] = ' ';
  1399.    bbs_node_info.reserve_1[3] = ' ';
  1400.    bbs_node_info.reserve_1[4] = ' ';
  1401.    bbs_node_info.sysop[0] = ' ';
  1402.    bbs_node_info.sysop[1] = '0';
  1403.    bbs_node_info.active[0] = 'A';
  1404.    bbs_node_info.reserved_2[0] = ' ';
  1405.    bbs_node_info.reserved_2[1] = ' ';
  1406.    bbs_node_info.reserved_3[0] = ' ';
  1407.    bbs_node_info.reserved_3[1] = ' ';
  1408.    bbs_node_info.reserved_3[2] = ' ';
  1409.    bbs_node_info.private_door[0] = ' ';
  1410.    bbs_node_info.private_door[1] = '0';
  1411.    bbs_node_info.transfer[0] = ' ';
  1412.    bbs_node_info.transfer[1] = ' ';
  1413.    strncpy(bbs_node_info.daily_exit_date, "01-01-1987", 10);
  1414.    strncpy(bbs_node_info.daily_exit_time, "01:00", 5);
  1415.    bbs_node_info.reliable[0] = '-';
  1416.    bbs_node_info.reliable[1] = '1';
  1417.    for(i = 0 ; i < 36 ; i++)
  1418.      bbs_node_info.reserved_4[i] = ' ';
  1419.  
  1420.  
  1421.    bbs_user_info.security = 100;
  1422.    bbs_user_info.options.logins = 2;
  1423.    bbs_user_info.options.last_msg = 0;
  1424.    bbs_user_info.options.protocol[0] = ' ';
  1425.    bbs_user_info.options.margins = 0;
  1426.    bbs_user_info.options.subscription = 0;
  1427.    bbs_user_info.options.page_length = 23;
  1428.    bbs_user_info.options.reserved[0] = ' ';
  1429.    for(i = 0 ; i < 24 ; i++)
  1430.      bbs_user_info.residence[i] = ' ';
  1431.    for(i = 0 ; i < 19 ; i++)
  1432.      bbs_user_info.reserved[i] = ' ';
  1433.    strncpy(bbs_user_info.last_on, "01-01-87 01:00", 14);
  1434.    for(i = 0 ; i < 3 ; i++)
  1435.      bbs_user_info.last_dir[i] = '\0';
  1436.    bbs_user_info.downloads = 0;
  1437.    bbs_user_info.uploads = 0;
  1438.    bbs_user_info.elapsed = 0;
  1439.  
  1440.  
  1441.    /*
  1442.     * Store users name
  1443.     */
  1444.  
  1445.     for(i = 0 ; i < 31 ; i++)                   /* Copy all 31 chars         */
  1446.       user_name[i] = bbs_node_info.name[i];
  1447.     user_name[31] = '\0';                       /* Null terminate it         */
  1448.  
  1449.  
  1450.    /*
  1451.     * Close file
  1452.     */
  1453.  
  1454.     file_close(&rfd);                           /* Close it                  */
  1455.  
  1456.  
  1457.    /*
  1458.     * Store security level
  1459.     */
  1460.  
  1461.    user_security  = bbs_user_info.security;
  1462.  
  1463.  
  1464.    /*
  1465.     * Store graphics type
  1466.     */
  1467.  
  1468.    string_data[0] = bbs_user_info.options.graphics[0]; /* Convert to number  */
  1469.    string_data[1] = '\0';
  1470.    user_graphics  = atoi(string_data);
  1471.  
  1472.  
  1473.    /*
  1474.     * Store nulls flag
  1475.     */
  1476.  
  1477.    if(bbs_user_info.options.bit_flags & BBS_OPTION_NULLS)
  1478.      user_nulls = 8;
  1479.    else
  1480.      user_nulls = 0;
  1481.  
  1482.  
  1483.    /*
  1484.     * Store caps flag
  1485.     */
  1486.  
  1487.    if(bbs_user_info.options.bit_flags & BBS_OPTION_CASE)
  1488.      user_caps = 1;
  1489.    else
  1490.      user_caps = 0;
  1491.  
  1492.  
  1493.    /*
  1494.     * Store page length
  1495.     */
  1496.  
  1497.    user_page = bbs_user_info.options.page_length;
  1498.  
  1499.  
  1500.    /*
  1501.     * Store timelimit
  1502.     */
  1503.  
  1504.    user_start   = cur_time();                   /* Remeber when we started   */
  1505.  
  1506.  
  1507.    /*
  1508.     * Exit
  1509.     */
  1510.  
  1511.    return(0);                                   /* Exit all ok               */
  1512.  
  1513. }
  1514.  
  1515.  
  1516. /******************************************************************************
  1517.  *
  1518.  * WCBBS_READ - Read user infor from Wildcat files
  1519.  *
  1520.  * process      1. If running local, exit
  1521.  *              2. Open CALLINFO.BBS file
  1522.  *              3. Exit if not found
  1523.  *              4. Read user record
  1524.  *              5. Exit if bad read
  1525.  *              6. Store users name
  1526.  *              7. Store logon time
  1527.  *              8. Store security level
  1528.  *              9. Store graphics type
  1529.  *             10. Store nulls flag
  1530.  *             11. Store caps flag
  1531.  *             12. Store page length
  1532.  *             13. Store used time
  1533.  *             14. Store timelimit
  1534.  *             15. Close file
  1535.  *             16. Exit
  1536.  * input        Node = -1 if no parameters
  1537.  *              Else node = BBS node number
  1538.  * output       Returns 0 if all ok
  1539.  *              Returns -1 if can't find CALLINFO.BBS info
  1540.  *              Returns -2 if can't read CALLINFO.BBS info
  1541.  *****************************************************************************/
  1542.  
  1543. wcbbs_read(node)
  1544.  
  1545. int     node;                                   /* BBS node number           */
  1546. {
  1547. long    cvt_time();                             /* Convert time string       */
  1548. long    cur_time();                             /* Get current time          */
  1549. long    atol();
  1550.  
  1551. FS      rfd;                                    /* File control block        */
  1552. long    foffset;                                /* File offset               */
  1553.  
  1554. int     i, j, k;                                /* Work variables            */
  1555. char    string_data[80];                        /* Work space                */
  1556.  
  1557.    /*
  1558.     * Exit if local only
  1559.     */
  1560.  
  1561.    if(remote_user == 0)                         /* If remote not active...   */
  1562.      return(0);                                 /* ...exit all ok            */
  1563.  
  1564.  
  1565.    /*
  1566.     * Open CALLINFO.BBS file
  1567.     */
  1568.  
  1569.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  1570.    strcat(rfd.name, "CALLINFO.BBS");
  1571.  
  1572.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open the file          */
  1573.    if(i)                                        /* If file not found...      */
  1574.      return(-1);                                /* ...exit with error        */
  1575.  
  1576.  
  1577.    /*
  1578.     * Read user node record
  1579.     */
  1580.  
  1581.    fseek(rfd.fd, 0L, 0);                        /* Seek the location         */
  1582.    for(i = 0 ; i < 28 ; i++)
  1583.    {
  1584.      if(fgets(ascii_user_info[i], 128, rfd.fd) == NULL) /* If bad read...    */
  1585.      {
  1586.        file_close(&rfd);
  1587.        return(-2);                                /* ...error                */
  1588.      }
  1589.    }
  1590.  
  1591.  
  1592.    /*
  1593.     * Copy parms to RBBS structures
  1594.     */
  1595.  
  1596.    bbs_node_info.snoop[0]        = '-';
  1597.    bbs_node_info.snoop[1]        = '1';
  1598.    bbs_node_info.line_printer[0] = ' ';
  1599.    bbs_node_info.line_printer[1] = '0';
  1600.    bbs_node_info.sysop_avail[0]  = '-';
  1601.    bbs_node_info.sysop_avail[1]  = '1';
  1602.  
  1603.    bbs_user_info.options.bit_flags = BBS_OPTION_BELL;
  1604.  
  1605.    bbs_node_info.sysop_next[0]   = ' ';
  1606.    bbs_node_info.sysop_next[1]   = '0';
  1607.  
  1608.    if(strncmp(ascii_user_info[1], "1", 1) == 0)
  1609.    {
  1610.      bbs_node_info.baud_rate[0] = '-';
  1611.      bbs_node_info.baud_rate[1] = '1';
  1612.      bbs_node_info.baud_dial[0] = '-';
  1613.      bbs_node_info.baud_dial[1] = '1';
  1614.    }
  1615.    else if(strncmp(ascii_user_info[1], "2", 1) == 0)
  1616.    {
  1617.      bbs_node_info.baud_rate[0] = '-';
  1618.      bbs_node_info.baud_rate[1] = '3';
  1619.      bbs_node_info.baud_dial[0] = '-';
  1620.      bbs_node_info.baud_dial[1] = '3';
  1621.    }
  1622.    else if(strncmp(ascii_user_info[1], "0", 1) == 0)
  1623.    {
  1624.      bbs_node_info.baud_rate[0] = '-';
  1625.      bbs_node_info.baud_rate[1] = '4';
  1626.      bbs_node_info.baud_dial[0] = '-';
  1627.      bbs_node_info.baud_dial[1] = '4';
  1628.    }
  1629.    else if(strncmp(ascii_user_info[1], "3", 1) == 0)
  1630.    {
  1631.      bbs_node_info.baud_rate[0] = '-';
  1632.      bbs_node_info.baud_rate[1] = '6';
  1633.      bbs_node_info.baud_dial[0] = '-';
  1634.      bbs_node_info.baud_dial[1] = '6';
  1635.    }
  1636.    else
  1637.    {
  1638.      bbs_node_info.baud_rate[0] = '-';
  1639.      bbs_node_info.baud_rate[1] = '3';
  1640.      bbs_node_info.baud_dial[0] = '-';
  1641.      bbs_node_info.baud_dial[1] = '3';
  1642.    }
  1643.  
  1644.    i = 0;
  1645.    while((i < 31) && (ascii_user_info[0][i] != 0x0d) &&
  1646.          (ascii_user_info[0][i] != 0x0a) && (ascii_user_info[0][i] != 0x00))
  1647.    {
  1648.      bbs_node_info.name[i] = ascii_user_info[0][i];
  1649.      user_name[i] = ascii_user_info[0][i];
  1650.      i++;
  1651.    }
  1652.    while(i < 31)
  1653.    {
  1654.      bbs_node_info.name[i] = ' ';
  1655.      user_name[i] = ' ';
  1656.      i++;
  1657.    }
  1658.    user_name[i] = '\0';
  1659.  
  1660.    if(strncmp(strupr(ascii_user_info[5]), "MONO", 4) == 0)
  1661.    {
  1662.      bbs_node_info.graphics_type[0] = ' ';
  1663.      bbs_node_info.graphics_type[0] = '0';
  1664.      bbs_user_info.options.graphics[0] = '0';
  1665.      user_graphics = 0;
  1666.    }
  1667.    else if(strncmp(strupr(ascii_user_info[5]), "COLOR", 5) == 0)
  1668.    {
  1669.      bbs_node_info.graphics_type[0] = ' ';
  1670.      bbs_node_info.graphics_type[0] = '2';
  1671.      bbs_user_info.options.graphics[0] = '2';
  1672.      user_graphics = 2;
  1673.    }
  1674.    else
  1675.    {
  1676.      bbs_node_info.graphics_type[0] = ' ';
  1677.      bbs_node_info.graphics_type[0] = '2';
  1678.      bbs_user_info.options.graphics[0] = '2';
  1679.      user_graphics = 2;
  1680.    }
  1681.  
  1682.    for(i = 0 ; i < 12 ; i++)
  1683.      bbs_user_info.password[i] = ascii_user_info[6][i];
  1684.    bbs_user_info.password[i] = '\0';
  1685.  
  1686.    user_start     = cur_time();
  1687.    user_signon    = cur_time();
  1688.    user_signoff   = atol(ascii_user_info[4]) * 60L;
  1689.    user_signoff  += user_signon;
  1690.  
  1691.    bbs_node_info.login_time[0] = ascii_user_info[10][0];
  1692.    bbs_node_info.login_time[1] = ascii_user_info[10][1];
  1693.    bbs_node_info.login_time[2] = ascii_user_info[10][3];
  1694.    bbs_node_info.login_time[3] = ascii_user_info[10][4];
  1695.    bbs_node_info.login_time[4] = '0';
  1696.    bbs_node_info.login_time[5] = '0';
  1697.  
  1698.  
  1699.    /*
  1700.     * Test for local access
  1701.     */
  1702.  
  1703.    i = 0;
  1704.    while(ascii_user_info[27][i] == ' ')
  1705.      i++;
  1706.    if(strnicmp(&(ascii_user_info[27][i]), "LOCAL", 5) == 0)
  1707.      remote_user = 0;
  1708.  
  1709.  
  1710.    /*
  1711.     * Fill unsuplied parms to RBBS structures
  1712.     */
  1713.  
  1714.    bbs_node_info.sysop_annoy[0] = ' ';
  1715.    bbs_node_info.sysop_annoy[1] = '0';
  1716.    bbs_node_info.doors_avail[0] = '-';
  1717.    bbs_node_info.doors_avail[1] = '1';
  1718.    bbs_node_info.eight_bits[0] = '-';
  1719.    bbs_node_info.eight_bits[1] = '1';
  1720.    bbs_node_info.upper_case[0] = ' ';
  1721.    bbs_node_info.upper_case[1] = '0';
  1722.    bbs_node_info.reserve_1[0] = ' ';
  1723.    bbs_node_info.reserve_1[1] = ' ';
  1724.    bbs_node_info.reserve_1[2] = ' ';
  1725.    bbs_node_info.reserve_1[3] = ' ';
  1726.    bbs_node_info.reserve_1[4] = ' ';
  1727.    bbs_node_info.sysop[0] = ' ';
  1728.    bbs_node_info.sysop[1] = '0';
  1729.    bbs_node_info.active[0] = 'A';
  1730.    bbs_node_info.reserved_2[0] = ' ';
  1731.    bbs_node_info.reserved_2[1] = ' ';
  1732.    bbs_node_info.reserved_3[0] = ' ';
  1733.    bbs_node_info.reserved_3[1] = ' ';
  1734.    bbs_node_info.reserved_3[2] = ' ';
  1735.    bbs_node_info.private_door[0] = ' ';
  1736.    bbs_node_info.private_door[1] = '0';
  1737.    bbs_node_info.transfer[0] = ' ';
  1738.    bbs_node_info.transfer[1] = ' ';
  1739.    strncpy(bbs_node_info.daily_exit_date, "01-01-1987", 10);
  1740.    strncpy(bbs_node_info.daily_exit_time, "01:00", 5);
  1741.    bbs_node_info.reliable[0] = '-';
  1742.    bbs_node_info.reliable[1] = '1';
  1743.    for(i = 0 ; i < 36 ; i++)
  1744.      bbs_node_info.reserved_4[i] = ' ';
  1745.  
  1746.  
  1747.    bbs_user_info.security = atoi(ascii_user_info[3]);
  1748.    bbs_user_info.options.logins = atoi(ascii_user_info[21]);
  1749.    bbs_user_info.options.last_msg = atoi(ascii_user_info[23]);
  1750.    bbs_user_info.options.protocol[0] = ' ';
  1751.    bbs_user_info.options.margins = 0;
  1752.    bbs_user_info.options.subscription = 0;
  1753.    bbs_user_info.options.page_length = atoi(ascii_user_info[22]);
  1754.    bbs_user_info.options.reserved[0] = ' ';
  1755.    for(i = 0 ; i < 24 ; i++)
  1756.      bbs_user_info.residence[i] = ' ';
  1757.    for(i = 0 ; i < 19 ; i++)
  1758.      bbs_user_info.reserved[i] = ' ';
  1759.    strncpy(bbs_user_info.last_on, "01-01-87 01:00", 14);
  1760.    for(i = 0 ; i < 3 ; i++)
  1761.      bbs_user_info.last_dir[i] = '\0';
  1762.    bbs_user_info.downloads = 0;
  1763.    bbs_user_info.uploads = 0;
  1764.    bbs_user_info.elapsed = 0;
  1765.  
  1766.  
  1767.    /*
  1768.     * Close file
  1769.     */
  1770.  
  1771.     file_close(&rfd);                           /* Close it                  */
  1772.  
  1773.  
  1774.    /*
  1775.     * Store security level
  1776.     */
  1777.  
  1778.    user_security  = bbs_user_info.security;
  1779.  
  1780.  
  1781.    /*
  1782.     * Store nulls flag
  1783.     */
  1784.  
  1785.    if(bbs_user_info.options.bit_flags & BBS_OPTION_NULLS)
  1786.      user_nulls = 8;
  1787.    else
  1788.      user_nulls = 0;
  1789.  
  1790.  
  1791.    /*
  1792.     * Store caps flag
  1793.     */
  1794.  
  1795.    if(bbs_user_info.options.bit_flags & BBS_OPTION_CASE)
  1796.      user_caps = 1;
  1797.    else
  1798.      user_caps = 0;
  1799.  
  1800.  
  1801.    /*
  1802.     * Store page length
  1803.     */
  1804.  
  1805.    user_page = bbs_user_info.options.page_length;
  1806.  
  1807.  
  1808.    /*
  1809.     * Store timelimit
  1810.     */
  1811.  
  1812.    user_start   = cur_time();                   /* Remeber when we started   */
  1813.  
  1814.  
  1815.    /*
  1816.     * Test for local login
  1817.     */
  1818.  
  1819.    if(strnicmp(ascii_user_info[27], "LOCAL", 5) == 0)
  1820.      remote_user = 0;
  1821.  
  1822.  
  1823.    /*
  1824.     * Exit
  1825.     */
  1826.  
  1827.    return(0);                                   /* Exit all ok               */
  1828.  
  1829. }
  1830.  
  1831.  
  1832. /******************************************************************************
  1833.  *
  1834.  * GBBS_READ - Read user infor from DOOR.SYS file
  1835.  *
  1836.  * process      1. If running local, exit
  1837.  *              2. Open DOOR.SYS file
  1838.  *              3. Exit if not found
  1839.  *              4. Read user record
  1840.  *              5. Exit if bad read
  1841.  *              6. Store users name
  1842.  *              7. Store logon time
  1843.  *              8. Store security level
  1844.  *              9. Store graphics type
  1845.  *             10. Store nulls flag
  1846.  *             11. Store caps flag
  1847.  *             12. Store page length
  1848.  *             13. Store used time
  1849.  *             14. Store timelimit
  1850.  *             15. Close file
  1851.  *             16. Exit
  1852.  * input        Node = -1 if no parameters
  1853.  *              Else node = BBS node number
  1854.  * output       Returns 0 if all ok
  1855.  *              Returns -1 if can't find DOOR.SYS info
  1856.  *              Returns -2 if can't read DOOR.SYS info
  1857.  *****************************************************************************/
  1858.  
  1859. gbbs_read(node)
  1860.  
  1861. int     node;                                   /* BBS node number           */
  1862. {
  1863. long    cvt_time();                             /* Convert time string       */
  1864. long    cur_time();                             /* Get current time          */
  1865. long    atol();                                 /* Convert ASCII to long     */
  1866.  
  1867. FS      rfd;                                    /* File control block        */
  1868. long    foffset;                                /* File offset               */
  1869.  
  1870. int     i, j, k;                                /* Work variables            */
  1871. char    string_data[80];                        /* Work space                */
  1872.  
  1873.    /*
  1874.     * Exit if local only
  1875.     */
  1876.  
  1877.    if(remote_user == 0)                         /* If remote not active...   */
  1878.      return(0);                                 /* ...exit all ok            */
  1879.  
  1880.  
  1881.    /*
  1882.     * Open DOOR.SYS file
  1883.     */
  1884.  
  1885.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  1886.    strcat(rfd.name, "DOOR.SYS");
  1887.  
  1888.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open the file          */
  1889.    if(i)                                        /* If file not found...      */
  1890.      return(-1);                                /* ...exit with error        */
  1891.  
  1892.  
  1893.    /*
  1894.     * Read user node record
  1895.     */
  1896.  
  1897.    fseek(rfd.fd, 0L, 0);                        /* Seek the location         */
  1898.    i = 0;                                       /* Line counter              */
  1899.    while((fgets(ascii_user_info[i], 128, rfd.fd) != NULL) && (i < 31))
  1900.      i++;
  1901.  
  1902.    /*
  1903.     * Close file
  1904.     */
  1905.  
  1906.     file_close(&rfd);                           /* Close it                  */
  1907.  
  1908.  
  1909.    if(i != 31)
  1910.      return(-2);                                /* ...error                  */
  1911.  
  1912.  
  1913.    /*
  1914.     * Copy parms to RBBS structures
  1915.     */
  1916.  
  1917.    i = 0;
  1918.    while(ascii_user_info[5][i] == ' ')
  1919.      i++;
  1920.    if((ascii_user_info[5][i] == 'Y') || (ascii_user_info[5][i] == 'y'))
  1921.    {
  1922.      bbs_node_info.snoop[0] = '-';
  1923.      bbs_node_info.snoop[1] = '1';
  1924.    }
  1925.    else
  1926.    {
  1927.      bbs_node_info.snoop[0] = ' ';
  1928.      bbs_node_info.snoop[1] = '0';
  1929.    }
  1930.  
  1931.  
  1932.    i = 0;
  1933.    while(ascii_user_info[6][i] == ' ')
  1934.      i++;
  1935.    if((ascii_user_info[6][i] == 'Y') || (ascii_user_info[6][i] == 'y'))
  1936.    {
  1937.      bbs_node_info.line_printer[0] = '-';
  1938.      bbs_node_info.line_printer[1] = '1';
  1939.    }
  1940.    else
  1941.    {
  1942.      bbs_node_info.line_printer[0] = ' ';
  1943.      bbs_node_info.line_printer[1] = '0';
  1944.    }
  1945.  
  1946.  
  1947.    i = 0;
  1948.    while(ascii_user_info[7][i] == ' ')
  1949.      i++;
  1950.    if((ascii_user_info[7][i] == 'Y') || (ascii_user_info[7][i] == 'y'))
  1951.    {
  1952.      bbs_node_info.sysop_avail[0] = '-';
  1953.      bbs_node_info.sysop_avail[1] = '1';
  1954.    }
  1955.    else
  1956.    {
  1957.      bbs_node_info.sysop_avail[0] = ' ';
  1958.      bbs_node_info.sysop_avail[1] = '0';
  1959.    }
  1960.  
  1961.  
  1962.  
  1963.    while(ascii_user_info[8][i] == ' ')
  1964.      i++;
  1965.    if((ascii_user_info[8][i] == 'Y') || (ascii_user_info[8][i] == 'y'))
  1966.      bbs_user_info.options.bit_flags = BBS_OPTION_BELL;
  1967.    else
  1968.      bbs_user_info.options.bit_flags = 0;
  1969.  
  1970.  
  1971.    bbs_node_info.sysop_next[0] = ' ';
  1972.    bbs_node_info.sysop_next[1] = '0';
  1973.  
  1974.  
  1975.    i = 0;
  1976.    while(ascii_user_info[1][i] == ' ')
  1977.      i++;
  1978.    if(strncmp(&ascii_user_info[1][i], "300", 3) == 0)
  1979.    {
  1980.      bbs_node_info.baud_rate[0] = '-';
  1981.      bbs_node_info.baud_rate[1] = '1';
  1982.      bbs_node_info.baud_dial[0] = '-';
  1983.      bbs_node_info.baud_dial[1] = '1';
  1984.    }
  1985.    else if(strncmp(&ascii_user_info[1][i], "450", 3) == 0)
  1986.    {
  1987.      bbs_node_info.baud_rate[0] = '-';
  1988.      bbs_node_info.baud_rate[1] = '2';
  1989.      bbs_node_info.baud_dial[0] = '-';
  1990.      bbs_node_info.baud_dial[1] = '2';
  1991.    }
  1992.    else if(strncmp(&ascii_user_info[1][i], "1200", 4) == 0)
  1993.    {
  1994.      bbs_node_info.baud_rate[0] = '-';
  1995.      bbs_node_info.baud_rate[1] = '3';
  1996.      bbs_node_info.baud_dial[0] = '-';
  1997.      bbs_node_info.baud_dial[1] = '3';
  1998.    }
  1999.    else if(strncmp(&ascii_user_info[1][i], "2400", 4) == 0)
  2000.    {
  2001.      bbs_node_info.baud_rate[0] = '-';
  2002.      bbs_node_info.baud_rate[1] = '4';
  2003.      bbs_node_info.baud_dial[0] = '-';
  2004.      bbs_node_info.baud_dial[1] = '4';
  2005.    }
  2006.    else if(strncmp(&ascii_user_info[1][i], "4800", 4) == 0)
  2007.    {
  2008.      bbs_node_info.baud_rate[0] = '-';
  2009.      bbs_node_info.baud_rate[1] = '5';
  2010.      bbs_node_info.baud_dial[0] = '-';
  2011.      bbs_node_info.baud_dial[1] = '5';
  2012.    }
  2013.    else if(strncmp(&ascii_user_info[1][i], "9600", 4) == 0)
  2014.    {
  2015.      bbs_node_info.baud_rate[0] = '-';
  2016.      bbs_node_info.baud_rate[1] = '6';
  2017.      bbs_node_info.baud_dial[0] = '-';
  2018.      bbs_node_info.baud_dial[1] = '6';
  2019.    }
  2020.    else
  2021.    {
  2022.      bbs_node_info.baud_rate[0] = '-';
  2023.      bbs_node_info.baud_rate[1] = '7';
  2024.      bbs_node_info.baud_dial[0] = '-';
  2025.      bbs_node_info.baud_dial[1] = '7';
  2026.    }
  2027.  
  2028.  
  2029.    i = 0;
  2030.    j = 0;
  2031.    while(ascii_user_info[9][i] == ' ')
  2032.      i++;
  2033.    while((j < 31) && (ascii_user_info[9][i] != 0x0d) &&
  2034.          (ascii_user_info[9][i] != 0x0a) && (ascii_user_info[9][i] != 0x00))
  2035.    {
  2036.      bbs_node_info.name[j] = ascii_user_info[9][i];
  2037.      bbs_user_info.name[j] = ascii_user_info[9][i];
  2038.      user_name[j] = ascii_user_info[9][i];
  2039.      i++;
  2040.      j++;
  2041.    }
  2042.    while(j < 31)
  2043.    {
  2044.      bbs_node_info.name[j] = ' ';
  2045.      bbs_user_info.name[j] = ' ';
  2046.      user_name[j] = ' ';
  2047.      j++;
  2048.    }
  2049.    user_name[j] = '\0';
  2050.    bbs_node_info.name[j] = '\0';
  2051.    bbs_user_info.name[j] = '\0';
  2052.  
  2053.  
  2054.  
  2055.    i = 0;
  2056.    while(ascii_user_info[19][i] == ' ')
  2057.      i++;
  2058.    if(strncmp(&ascii_user_info[19][i], "GR", 2) == 0)
  2059.    {
  2060.      bbs_node_info.graphics_type[0] = ' ';
  2061.      bbs_node_info.graphics_type[0] = '2';
  2062.      bbs_user_info.options.graphics[0] = '2';
  2063.    }
  2064.    else
  2065.    {
  2066.      bbs_node_info.graphics_type[0] = ' ';
  2067.      bbs_node_info.graphics_type[0] = '0';
  2068.      bbs_user_info.options.graphics[0] = '0';
  2069.    }
  2070.  
  2071.  
  2072.    i = 0;
  2073.    j = 0;
  2074.    while(ascii_user_info[13][i] == ' ')
  2075.      i++;
  2076.    while((j < 12) && (ascii_user_info[13][i] != 0x0d) &&
  2077.          (ascii_user_info[13][i] != 0x0a) && (ascii_user_info[13][i] != 0x00))
  2078.    {
  2079.      bbs_user_info.password[j] = ascii_user_info[13][i];
  2080.      i++;
  2081.      j++;
  2082.    }
  2083.    while(j < 12)
  2084.    {
  2085.      bbs_user_info.password[j] = ' ';
  2086.      j++;
  2087.    }
  2088.    bbs_user_info.password[j] = '\0';
  2089.  
  2090.  
  2091.  
  2092.    i = 0;
  2093.    while(ascii_user_info[17][i] == ' ')
  2094.      i++;
  2095.    user_start    = cur_time();
  2096.    user_signon   = cur_time();
  2097.    user_signoff  = atol(&ascii_user_info[17][i]);
  2098.    user_signoff += user_signon;
  2099.  
  2100.  
  2101.    i = 0;
  2102.    while(ascii_user_info[14][i] == ' ')
  2103.      i++;
  2104.    bbs_user_info.security = atoi(&ascii_user_info[14][i]);
  2105.  
  2106.  
  2107.    i = 0;
  2108.    while(ascii_user_info[20][i] == ' ')
  2109.      i++;
  2110.    bbs_user_info.options.page_length = atoi(&ascii_user_info[20][i]);
  2111.  
  2112.  
  2113.    /*
  2114.     * Test for local access
  2115.     */
  2116.  
  2117.    i = 0;
  2118.    while(ascii_user_info[0][i] == ' ')
  2119.      i++;
  2120.    if(strcmpi(&(ascii_user_info[27][i]), "COM0") == 0)
  2121.      remote_user = 0;
  2122.  
  2123.  
  2124.    /*
  2125.     * Fill unsuplied parms to RBBS structures
  2126.     */
  2127.  
  2128.    bbs_node_info.login_time[0] = '0';
  2129.    bbs_node_info.login_time[1] = '0';
  2130.    bbs_node_info.login_time[2] = '0';
  2131.    bbs_node_info.login_time[3] = '0';
  2132.    bbs_node_info.login_time[4] = '0';
  2133.    bbs_node_info.login_time[5] = '0';
  2134.    bbs_node_info.sysop_annoy[0] = ' ';
  2135.    bbs_node_info.sysop_annoy[1] = '0';
  2136.    bbs_node_info.doors_avail[0] = '-';
  2137.    bbs_node_info.doors_avail[1] = '1';
  2138.    bbs_node_info.eight_bits[0] = '-';
  2139.    bbs_node_info.eight_bits[1] = '1';
  2140.    bbs_node_info.upper_case[0] = ' ';
  2141.    bbs_node_info.upper_case[1] = '0';
  2142.    bbs_node_info.reserve_1[0] = ' ';
  2143.    bbs_node_info.reserve_1[1] = ' ';
  2144.    bbs_node_info.reserve_1[2] = ' ';
  2145.    bbs_node_info.reserve_1[3] = ' ';
  2146.    bbs_node_info.reserve_1[4] = ' ';
  2147.    bbs_node_info.sysop[0] = ' ';
  2148.    bbs_node_info.sysop[1] = '0';
  2149.    bbs_node_info.active[0] = 'A';
  2150.    bbs_node_info.reserved_2[0] = ' ';
  2151.    bbs_node_info.reserved_2[1] = ' ';
  2152.    bbs_node_info.reserved_3[0] = ' ';
  2153.    bbs_node_info.reserved_3[1] = ' ';
  2154.    bbs_node_info.reserved_3[2] = ' ';
  2155.    bbs_node_info.private_door[0] = ' ';
  2156.    bbs_node_info.private_door[1] = '0';
  2157.    bbs_node_info.transfer[0] = ' ';
  2158.    bbs_node_info.transfer[1] = ' ';
  2159.    strncpy(bbs_node_info.daily_exit_date, "01-01-1987", 10);
  2160.    strncpy(bbs_node_info.daily_exit_time, "01:00", 5);
  2161.    bbs_node_info.reliable[0] = '-';
  2162.    bbs_node_info.reliable[1] = '1';
  2163.    for(i = 0 ; i < 36 ; i++)
  2164.      bbs_node_info.reserved_4[i] = ' ';
  2165.  
  2166.  
  2167.    bbs_user_info.options.logins = 2;
  2168.    bbs_user_info.options.last_msg = 0;
  2169.    bbs_user_info.options.protocol[0] = ' ';
  2170.    bbs_user_info.options.margins = 0;
  2171.    bbs_user_info.options.subscription = 0;
  2172.    bbs_user_info.options.reserved[0] = ' ';
  2173.    for(i = 0 ; i < 24 ; i++)
  2174.      bbs_user_info.residence[i] = ' ';
  2175.    for(i = 0 ; i < 19 ; i++)
  2176.      bbs_user_info.reserved[i] = ' ';
  2177.    strncpy(bbs_user_info.last_on, "01-01-87 01:00", 14);
  2178.    for(i = 0 ; i < 3 ; i++)
  2179.      bbs_user_info.last_dir[i] = '\0';
  2180.    bbs_user_info.downloads = 0;
  2181.    bbs_user_info.uploads = 0;
  2182.    bbs_user_info.elapsed = 0;
  2183.  
  2184.  
  2185.    /*
  2186.     * Store users name
  2187.     */
  2188.  
  2189.     for(i = 0 ; i < 31 ; i++)                   /* Copy all 31 chars         */
  2190.       user_name[i] = bbs_node_info.name[i];
  2191.     user_name[31] = '\0';                       /* Null terminate it         */
  2192.  
  2193.  
  2194.    /*
  2195.     * Store security level
  2196.     */
  2197.  
  2198.    user_security  = bbs_user_info.security;
  2199.  
  2200.  
  2201.    /*
  2202.     * Store graphics type
  2203.     */
  2204.  
  2205.    string_data[0] = bbs_user_info.options.graphics[0]; /* Convert to number  */
  2206.    string_data[1] = '\0';
  2207.    user_graphics  = atoi(string_data);
  2208.  
  2209.  
  2210.    /*
  2211.     * Store nulls flag
  2212.     */
  2213.  
  2214.    if(bbs_user_info.options.bit_flags & BBS_OPTION_NULLS)
  2215.      user_nulls = 8;
  2216.    else
  2217.      user_nulls = 0;
  2218.  
  2219.  
  2220.    /*
  2221.     * Store caps flag
  2222.     */
  2223.  
  2224.    if(bbs_user_info.options.bit_flags & BBS_OPTION_CASE)
  2225.      user_caps = 1;
  2226.    else
  2227.      user_caps = 0;
  2228.  
  2229.  
  2230.    /*
  2231.     * Store page length
  2232.     */
  2233.  
  2234.    user_page = bbs_user_info.options.page_length;
  2235.  
  2236.  
  2237.    /*
  2238.     * Store timelimit
  2239.     */
  2240.  
  2241.    user_start   = cur_time();                   /* Remeber when we started   */
  2242.  
  2243.  
  2244.    /*
  2245.     * Exit
  2246.     */
  2247.  
  2248.    return(0);                                   /* Exit all ok               */
  2249.  
  2250. }
  2251.  
  2252.  
  2253. /******************************************************************************
  2254.  *
  2255.  * WBBS_READ - Read user infor from CHAIN.TXT file
  2256.  *
  2257.  * process      1. If running local, exit
  2258.  *              2. Open CHAIN.TXT file
  2259.  *              3. Exit if not found
  2260.  *              4. Read user record
  2261.  *              5. Exit if bad read
  2262.  *              6. Store users name
  2263.  *              7. Store logon time
  2264.  *              8. Store security level
  2265.  *              9. Store graphics type
  2266.  *             10. Store nulls flag
  2267.  *             11. Store caps flag
  2268.  *             12. Store page length
  2269.  *             13. Store used time
  2270.  *             14. Store timelimit
  2271.  *             15. Close file
  2272.  *             16. Exit
  2273.  * input        Node = -1 if no parameters
  2274.  *              Else node = BBS node number
  2275.  * output       Returns 0 if all ok
  2276.  *              Returns -1 if can't find CHAIN.TXT info
  2277.  *              Returns -2 if can't read CHAIN.TXT info
  2278.  *****************************************************************************/
  2279.  
  2280. wbbs_read(node)
  2281.  
  2282. int     node;                                   /* BBS node number           */
  2283. {
  2284. long    cvt_time();                             /* Convert time string       */
  2285. long    cur_time();                             /* Get current time          */
  2286. long    atol();                                 /* Convert ASCII to long     */
  2287.  
  2288. FS      rfd;                                    /* File control block        */
  2289. long    foffset;                                /* File offset               */
  2290.  
  2291. int     i, j, k;                                /* Work variables            */
  2292. char    string_data[80];                        /* Work space                */
  2293.  
  2294.    /*
  2295.     * Exit if local only
  2296.     */
  2297.  
  2298.    if(remote_user == 0)                         /* If remote not active...   */
  2299.      return(0);                                 /* ...exit all ok            */
  2300.  
  2301.  
  2302.    /*
  2303.     * Open CHAIN.TXT file
  2304.     */
  2305.  
  2306.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  2307.    strcat(rfd.name, "CHAIN.TXT");
  2308.  
  2309.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open the file          */
  2310.    if(i)                                        /* If file not found...      */
  2311.      return(-1);                                /* ...exit with error        */
  2312.  
  2313.  
  2314.    /*
  2315.     * Read user node record
  2316.     */
  2317.  
  2318.    fseek(rfd.fd, 0L, 0);                        /* Seek the location         */
  2319.    i = 0;                                       /* Line counter              */
  2320.    while((fgets(ascii_user_info[i], 128, rfd.fd) != NULL) && (i < 21))
  2321.      i++;
  2322.  
  2323.  
  2324.    /*
  2325.     * Close file
  2326.     */
  2327.  
  2328.     file_close(&rfd);                           /* Close it                  */
  2329.  
  2330.    if(i != 21)
  2331.      return(-2);                                /* ...error                  */
  2332.  
  2333.  
  2334.    /*
  2335.     * Copy parms to RBBS structures
  2336.     */
  2337.  
  2338.    i = 0;
  2339.    while(ascii_user_info[19][i] == ' ')
  2340.      i++;
  2341.    if(strncmp(&ascii_user_info[19][i], "300", 3) == 0)
  2342.    {
  2343.      bbs_node_info.baud_rate[0] = '-';
  2344.      bbs_node_info.baud_rate[1] = '1';
  2345.      bbs_node_info.baud_dial[0] = '-';
  2346.      bbs_node_info.baud_dial[1] = '1';
  2347.    }
  2348.    else if(strncmp(&ascii_user_info[19][i], "450", 3) == 0)
  2349.    {
  2350.      bbs_node_info.baud_rate[0] = '-';
  2351.      bbs_node_info.baud_rate[1] = '2';
  2352.      bbs_node_info.baud_dial[0] = '-';
  2353.      bbs_node_info.baud_dial[1] = '2';
  2354.    }
  2355.    else if(strncmp(&ascii_user_info[19][i], "1200", 4) == 0)
  2356.    {
  2357.      bbs_node_info.baud_rate[0] = '-';
  2358.      bbs_node_info.baud_rate[1] = '3';
  2359.      bbs_node_info.baud_dial[0] = '-';
  2360.      bbs_node_info.baud_dial[1] = '3';
  2361.    }
  2362.    else if(strncmp(&ascii_user_info[19][i], "2400", 4) == 0)
  2363.    {
  2364.      bbs_node_info.baud_rate[0] = '-';
  2365.      bbs_node_info.baud_rate[1] = '4';
  2366.      bbs_node_info.baud_dial[0] = '-';
  2367.      bbs_node_info.baud_dial[1] = '4';
  2368.    }
  2369.    else if(strncmp(&ascii_user_info[19][i], "4800", 4) == 0)
  2370.    {
  2371.      bbs_node_info.baud_rate[0] = '-';
  2372.      bbs_node_info.baud_rate[1] = '5';
  2373.      bbs_node_info.baud_dial[0] = '-';
  2374.      bbs_node_info.baud_dial[1] = '5';
  2375.    }
  2376.    else if(strncmp(&ascii_user_info[19][i], "9600", 4) == 0)
  2377.    {
  2378.      bbs_node_info.baud_rate[0] = '-';
  2379.      bbs_node_info.baud_rate[1] = '6';
  2380.      bbs_node_info.baud_dial[0] = '-';
  2381.      bbs_node_info.baud_dial[1] = '6';
  2382.    }
  2383.    else if(strncmp(&ascii_user_info[19][i], "19200", 5) == 0)
  2384.    {
  2385.      bbs_node_info.baud_rate[0] = '-';
  2386.      bbs_node_info.baud_rate[1] = '7';
  2387.      bbs_node_info.baud_dial[0] = '-';
  2388.      bbs_node_info.baud_dial[1] = '7';
  2389.    }
  2390.    else if(strncmp(&ascii_user_info[19][i], "38400", 5) == 0)
  2391.    {
  2392.      bbs_node_info.baud_rate[0] = '-';
  2393.      bbs_node_info.baud_rate[1] = '8';
  2394.      bbs_node_info.baud_dial[0] = '-';
  2395.      bbs_node_info.baud_dial[1] = '8';
  2396.    }
  2397.    else
  2398.    {
  2399.      remote_user = 0;
  2400.    }
  2401.  
  2402.  
  2403.    i = 0;
  2404.    j = 0;
  2405.    while(ascii_user_info[3][i] == ' ')
  2406.      i++;
  2407.    while((j < 31) && (ascii_user_info[2][i] != 0x0d) &&
  2408.          (ascii_user_info[2][i] != 0x0a) && (ascii_user_info[2][i] != 0x00))
  2409.    {
  2410.      bbs_node_info.name[j] = ascii_user_info[2][i];
  2411.      bbs_user_info.name[j] = ascii_user_info[2][i];
  2412.      user_name[j] = ascii_user_info[2][i];
  2413.      i++;
  2414.      j++;
  2415.    }
  2416.    while(j < 31)
  2417.    {
  2418.      bbs_node_info.name[j] = ' ';
  2419.      bbs_user_info.name[j] = ' ';
  2420.      user_name[j] = ' ';
  2421.      j++;
  2422.    }
  2423.    user_name[j] = '\0';
  2424.    bbs_node_info.name[j] = '\0';
  2425.    bbs_user_info.name[j] = '\0';
  2426.  
  2427.  
  2428.  
  2429.    i = 0;
  2430.    while(ascii_user_info[13][i] == ' ')
  2431.      i++;
  2432.    if(ascii_user_info[13][i] == '1')
  2433.    {
  2434.      bbs_node_info.graphics_type[0] = ' ';
  2435.      bbs_node_info.graphics_type[0] = '2';
  2436.      bbs_user_info.options.graphics[0] = '2';
  2437.    }
  2438.    else
  2439.    {
  2440.      bbs_node_info.graphics_type[0] = ' ';
  2441.      bbs_node_info.graphics_type[0] = '0';
  2442.      bbs_user_info.options.graphics[0] = '0';
  2443.    }
  2444.  
  2445.  
  2446.    i = 0;
  2447.    while(ascii_user_info[15][i] == ' ')
  2448.      i++;
  2449.    user_start    = cur_time();
  2450.    user_signon   = cur_time();
  2451.    user_signoff  = atol(&ascii_user_info[15][i]);
  2452.    user_signoff += user_signon;
  2453.  
  2454.  
  2455.    i = 0;
  2456.    while(ascii_user_info[10][i] == ' ')
  2457.      i++;
  2458.    bbs_user_info.security = atoi(&ascii_user_info[10][i]);
  2459.  
  2460.  
  2461.    i = 0;
  2462.    while(ascii_user_info[9][i] == ' ')
  2463.      i++;
  2464.    bbs_user_info.options.page_length = atoi(&ascii_user_info[9][i]);
  2465.  
  2466.  
  2467.    /*
  2468.     * Fill unsuplied parms to RBBS structures
  2469.     */
  2470.  
  2471.    bbs_node_info.snoop[0] = '-';
  2472.    bbs_node_info.snoop[1] = '1';
  2473.    bbs_node_info.line_printer[0] = ' ';
  2474.    bbs_node_info.line_printer[1] = '0';
  2475.    bbs_node_info.sysop_avail[0] = '-';
  2476.    bbs_node_info.sysop_avail[1] = '1';
  2477.    bbs_user_info.options.bit_flags = BBS_OPTION_BELL;
  2478.    bbs_node_info.sysop_next[0] = ' ';
  2479.    bbs_node_info.sysop_next[1] = '0';
  2480.    strcpy(bbs_user_info.password, "Password");
  2481.    bbs_node_info.login_time[0] = '0';
  2482.    bbs_node_info.login_time[1] = '0';
  2483.    bbs_node_info.login_time[2] = '0';
  2484.    bbs_node_info.login_time[3] = '0';
  2485.    bbs_node_info.login_time[4] = '0';
  2486.    bbs_node_info.login_time[5] = '0';
  2487.    bbs_node_info.sysop_annoy[0] = ' ';
  2488.    bbs_node_info.sysop_annoy[1] = '0';
  2489.    bbs_node_info.doors_avail[0] = '-';
  2490.    bbs_node_info.doors_avail[1] = '1';
  2491.    bbs_node_info.eight_bits[0] = '-';
  2492.    bbs_node_info.eight_bits[1] = '1';
  2493.    bbs_node_info.upper_case[0] = ' ';
  2494.    bbs_node_info.upper_case[1] = '0';
  2495.    bbs_node_info.reserve_1[0] = ' ';
  2496.    bbs_node_info.reserve_1[1] = ' ';
  2497.    bbs_node_info.reserve_1[2] = ' ';
  2498.    bbs_node_info.reserve_1[3] = ' ';
  2499.    bbs_node_info.reserve_1[4] = ' ';
  2500.    bbs_node_info.sysop[0] = ' ';
  2501.    bbs_node_info.sysop[1] = '0';
  2502.    bbs_node_info.active[0] = 'A';
  2503.    bbs_node_info.reserved_2[0] = ' ';
  2504.    bbs_node_info.reserved_2[1] = ' ';
  2505.    bbs_node_info.reserved_3[0] = ' ';
  2506.    bbs_node_info.reserved_3[1] = ' ';
  2507.    bbs_node_info.reserved_3[2] = ' ';
  2508.    bbs_node_info.private_door[0] = ' ';
  2509.    bbs_node_info.private_door[1] = '0';
  2510.    bbs_node_info.transfer[0] = ' ';
  2511.    bbs_node_info.transfer[1] = ' ';
  2512.    strncpy(bbs_node_info.daily_exit_date, "01-01-1987", 10);
  2513.    strncpy(bbs_node_info.daily_exit_time, "01:00", 5);
  2514.    bbs_node_info.reliable[0] = '-';
  2515.    bbs_node_info.reliable[1] = '1';
  2516.    for(i = 0 ; i < 36 ; i++)
  2517.      bbs_node_info.reserved_4[i] = ' ';
  2518.  
  2519.  
  2520.    bbs_user_info.options.logins = 2;
  2521.    bbs_user_info.options.last_msg = 0;
  2522.    bbs_user_info.options.protocol[0] = ' ';
  2523.    bbs_user_info.options.margins = 0;
  2524.    bbs_user_info.options.subscription = 0;
  2525.    bbs_user_info.options.reserved[0] = ' ';
  2526.    for(i = 0 ; i < 24 ; i++)
  2527.      bbs_user_info.residence[i] = ' ';
  2528.    for(i = 0 ; i < 19 ; i++)
  2529.      bbs_user_info.reserved[i] = ' ';
  2530.    strncpy(bbs_user_info.last_on, "01-01-87 01:00", 14);
  2531.    for(i = 0 ; i < 3 ; i++)
  2532.      bbs_user_info.last_dir[i] = '\0';
  2533.    bbs_user_info.downloads = 0;
  2534.    bbs_user_info.uploads = 0;
  2535.    bbs_user_info.elapsed = 0;
  2536.  
  2537.  
  2538.    /*
  2539.     * Store users name
  2540.     */
  2541.  
  2542.     for(i = 0 ; i < 31 ; i++)                   /* Copy all 31 chars         */
  2543.       user_name[i] = bbs_node_info.name[i];
  2544.     user_name[31] = '\0';                       /* Null terminate it         */
  2545.  
  2546.  
  2547.    /*
  2548.     * Store security level
  2549.     */
  2550.  
  2551.    user_security  = bbs_user_info.security;
  2552.  
  2553.  
  2554.    /*
  2555.     * Store graphics type
  2556.     */
  2557.  
  2558.    string_data[0] = bbs_user_info.options.graphics[0]; /* Convert to number  */
  2559.    string_data[1] = '\0';
  2560.    user_graphics  = atoi(string_data);
  2561.  
  2562.  
  2563.    /*
  2564.     * Store nulls flag
  2565.     */
  2566.  
  2567.    if(bbs_user_info.options.bit_flags & BBS_OPTION_NULLS)
  2568.      user_nulls = 8;
  2569.    else
  2570.      user_nulls = 0;
  2571.  
  2572.  
  2573.    /*
  2574.     * Store caps flag
  2575.     */
  2576.  
  2577.    if(bbs_user_info.options.bit_flags & BBS_OPTION_CASE)
  2578.      user_caps = 1;
  2579.    else
  2580.      user_caps = 0;
  2581.  
  2582.  
  2583.    /*
  2584.     * Store page length
  2585.     */
  2586.  
  2587.    user_page = bbs_user_info.options.page_length;
  2588.  
  2589.  
  2590.    /*
  2591.     * Store timelimit
  2592.     */
  2593.  
  2594.    user_start   = cur_time();                   /* Remeber when we started   */
  2595.  
  2596.  
  2597.    /*
  2598.     * Exit
  2599.     */
  2600.  
  2601.    return(0);                                   /* Exit all ok               */
  2602.  
  2603. }
  2604.  
  2605.  
  2606. /******************************************************************************
  2607.  *
  2608.  * SFBBS_READ - Read user infor from Spitfire file
  2609.  *
  2610.  * process      1. If running local, exit
  2611.  *              2. Open Spitfire file
  2612.  *              3. Exit if not found
  2613.  *              4. Read user record
  2614.  *              5. Exit if bad read
  2615.  *              6. Store users name
  2616.  *              7. Store logon time
  2617.  *              8. Store security level
  2618.  *              9. Store graphics type
  2619.  *             10. Store nulls flag
  2620.  *             11. Store caps flag
  2621.  *             12. Store page length
  2622.  *             13. Store used time
  2623.  *             14. Store timelimit
  2624.  *             15. Close file
  2625.  *             16. Exit
  2626.  * input        Node = -1 if no parameters
  2627.  *              Else node = BBS node number
  2628.  * output       Returns 0 if all ok
  2629.  *              Returns -1 if can't find Spitfire info
  2630.  *              Returns -2 if can't read Spitfire info
  2631.  *****************************************************************************/
  2632.  
  2633. sfbbs_read(node, sfname)
  2634.  
  2635. int     node;                                   /* BBS node number           */
  2636. char    *sfname;                                /* Spitfire data file        */
  2637. {
  2638. long    cvt_time();                             /* Convert time string       */
  2639. long    cur_time();                             /* Get current time          */
  2640. long    atol();                                 /* Convert ASCII to long     */
  2641.  
  2642. FS      rfd;                                    /* File control block        */
  2643. long    foffset;                                /* File offset               */
  2644.  
  2645. int     i, j, k;                                /* Work variables            */
  2646. char    string_data[80];                        /* Work space                */
  2647.  
  2648.    /*
  2649.     * Exit if local only
  2650.     */
  2651.  
  2652.    if(remote_user == 0)                         /* If remote not active...   */
  2653.      return(0);                                 /* ...exit all ok            */
  2654.  
  2655.  
  2656.    /*
  2657.     * Open Spitfire file
  2658.     */
  2659.  
  2660.    strcpy(rfd.name, bbs_dir);                   /* Build the filename        */
  2661.    strcat(rfd.name, sfname);
  2662.  
  2663.    i = file_open(&rfd, FREAD, FBINARY, FNOCREATE); /* Open the file          */
  2664.    if(i)                                        /* If file not found...      */
  2665.      return(-1);                                /* ...exit with error        */
  2666.  
  2667.  
  2668.    /*
  2669.     * Read user node record
  2670.     */
  2671.  
  2672.    fseek(rfd.fd, 0L, 0);                        /* Seek the location         */
  2673.    i = 0;                                       /* Line counter              */
  2674.    while((fgets(ascii_user_info[i], 128, rfd.fd) != NULL) && (i < 20))
  2675.      i++;
  2676.  
  2677.  
  2678.    /*
  2679.     * Close file
  2680.     */
  2681.  
  2682.     file_close(&rfd);                           /* Close it                  */
  2683.  
  2684.    if(i != 20)
  2685.      return(-2);                                /* ...error                  */
  2686.  
  2687.  
  2688.    /*
  2689.     * Copy parms to RBBS structures
  2690.     */
  2691.  
  2692.    i = 0;
  2693.    while(ascii_user_info[19][i] == ' ')
  2694.      i++;
  2695.    if(atoi(&(ascii_user_info[4][i])) == 0)
  2696.    {
  2697.      remote_user = 0;
  2698.      bbs_node_info.baud_rate[0] = '-';
  2699.      bbs_node_info.baud_rate[1] = '4';
  2700.      bbs_node_info.baud_dial[0] = '-';
  2701.      bbs_node_info.baud_dial[1] = '4';
  2702.    }
  2703.    else if(atoi(&(ascii_user_info[4][i])) == 300)
  2704.    {
  2705.      bbs_node_info.baud_rate[0] = '-';
  2706.      bbs_node_info.baud_rate[1] = '1';
  2707.      bbs_node_info.baud_dial[0] = '-';
  2708.      bbs_node_info.baud_dial[1] = '1';
  2709.    }
  2710.    else if(atoi(&(ascii_user_info[4][i])) == 450)
  2711.    {
  2712.      bbs_node_info.baud_rate[0] = '-';
  2713.      bbs_node_info.baud_rate[1] = '2';
  2714.      bbs_node_info.baud_dial[0] = '-';
  2715.      bbs_node_info.baud_dial[1] = '2';
  2716.    }
  2717.    else if(atoi(&(ascii_user_info[4][i])) == 1200)
  2718.    {
  2719.      bbs_node_info.baud_rate[0] = '-';
  2720.      bbs_node_info.baud_rate[1] = '3';
  2721.      bbs_node_info.baud_dial[0] = '-';
  2722.      bbs_node_info.baud_dial[1] = '3';
  2723.    }
  2724.    else if(atoi(&(ascii_user_info[4][i])) == 2400)
  2725.    {
  2726.      bbs_node_info.baud_rate[0] = '-';
  2727.      bbs_node_info.baud_rate[1] = '4';
  2728.      bbs_node_info.baud_dial[0] = '-';
  2729.      bbs_node_info.baud_dial[1] = '4';
  2730.    }
  2731.    else if(atoi(&(ascii_user_info[4][i])) == 4800)
  2732.    {
  2733.      bbs_node_info.baud_rate[0] = '-';
  2734.      bbs_node_info.baud_rate[1] = '5';
  2735.      bbs_node_info.baud_dial[0] = '-';
  2736.      bbs_node_info.baud_dial[1] = '5';
  2737.    }
  2738.    else if(atoi(&(ascii_user_info[4][i])) == 9600)
  2739.    {
  2740.      bbs_node_info.baud_rate[0] = '-';
  2741.      bbs_node_info.baud_rate[1] = '6';
  2742.      bbs_node_info.baud_dial[0] = '-';
  2743.      bbs_node_info.baud_dial[1] = '6';
  2744.    }
  2745.    else if(atoi(&(ascii_user_info[4][i])) == 19200)
  2746.    {
  2747.      bbs_node_info.baud_rate[0] = '-';
  2748.      bbs_node_info.baud_rate[1] = '7';
  2749.      bbs_node_info.baud_dial[0] = '-';
  2750.      bbs_node_info.baud_dial[1] = '7';
  2751.    }
  2752.    else if(atoi(&(ascii_user_info[4][i])) == 38400)
  2753.    {
  2754.      bbs_node_info.baud_rate[0] = '-';
  2755.      bbs_node_info.baud_rate[1] = '8';
  2756.      bbs_node_info.baud_dial[0] = '-';
  2757.      bbs_node_info.baud_dial[1] = '8';
  2758.    }
  2759.    else
  2760.    {
  2761.      bbs_node_info.baud_rate[0] = '-';
  2762.      bbs_node_info.baud_rate[1] = '4';
  2763.      bbs_node_info.baud_dial[0] = '-';
  2764.      bbs_node_info.baud_dial[1] = '4';
  2765.    }
  2766.  
  2767.  
  2768.    i = 0;
  2769.    j = 0;
  2770.    while(ascii_user_info[1][i] == ' ')
  2771.      i++;
  2772.    while((j < 31) && (ascii_user_info[1][i] != 0x0d) &&
  2773.          (ascii_user_info[1][i] != 0x0a) && (ascii_user_info[1][i] != 0x00))
  2774.    {
  2775.      bbs_node_info.name[j] = ascii_user_info[1][i];
  2776.      bbs_user_info.name[j] = ascii_user_info[1][i];
  2777.      user_name[j] = ascii_user_info[1][i];
  2778.      i++;
  2779.      j++;
  2780.    }
  2781.    while(j < 31)
  2782.    {
  2783.      bbs_node_info.name[j] = ' ';
  2784.      bbs_user_info.name[j] = ' ';
  2785.      user_name[j] = ' ';
  2786.      j++;
  2787.    }
  2788.    user_name[j] = '\0';
  2789.    bbs_node_info.name[j] = '\0';
  2790.    bbs_user_info.name[j] = '\0';
  2791.  
  2792.  
  2793.  
  2794.    i = 0;
  2795.    while(ascii_user_info[9][i] == ' ')
  2796.      i++;
  2797.    if(strcmpi(&(ascii_user_info[9][i]), "TRUE") == 0)
  2798.    {
  2799.      bbs_node_info.graphics_type[0] = ' ';
  2800.      bbs_node_info.graphics_type[0] = '2';
  2801.      bbs_user_info.options.graphics[0] = '2';
  2802.    }
  2803.    else
  2804.    {
  2805.      bbs_node_info.graphics_type[0] = ' ';
  2806.      bbs_node_info.graphics_type[0] = '0';
  2807.      bbs_user_info.options.graphics[0] = '0';
  2808.    }
  2809.  
  2810.  
  2811.    i = 0;
  2812.    while(ascii_user_info[6][i] == ' ')
  2813.      i++;
  2814.    user_start    = cur_time();
  2815.    user_signon   = cur_time();
  2816.    user_signoff  = atol(&ascii_user_info[6][i]);
  2817.    user_signoff *= 60L;
  2818.    user_signoff += user_signon;
  2819.  
  2820.  
  2821.    i = 0;
  2822.    while(ascii_user_info[10][i] == ' ')
  2823.      i++;
  2824.    bbs_user_info.security = atoi(&ascii_user_info[10][i]);
  2825.  
  2826.  
  2827.    /*
  2828.     * Fill unsuplied parms to RBBS structures
  2829.     */
  2830.  
  2831.    bbs_node_info.snoop[0] = '-';
  2832.    bbs_node_info.snoop[1] = '1';
  2833.    bbs_node_info.line_printer[0] = ' ';
  2834.    bbs_node_info.line_printer[1] = '0';
  2835.    bbs_node_info.sysop_avail[0] = '-';
  2836.    bbs_node_info.sysop_avail[1] = '1';
  2837.    bbs_user_info.options.bit_flags = BBS_OPTION_BELL;
  2838.    bbs_user_info.options.page_length = 23;
  2839.    bbs_node_info.sysop_next[0] = ' ';
  2840.    bbs_node_info.sysop_next[1] = '0';
  2841.    strcpy(bbs_user_info.password, "Password");
  2842.    bbs_node_info.login_time[0] = '0';
  2843.    bbs_node_info.login_time[1] = '0';
  2844.    bbs_node_info.login_time[2] = '0';
  2845.    bbs_node_info.login_time[3] = '0';
  2846.    bbs_node_info.login_time[4] = '0';
  2847.    bbs_node_info.login_time[5] = '0';
  2848.    bbs_node_info.sysop_annoy[0] = ' ';
  2849.    bbs_node_info.sysop_annoy[1] = '0';
  2850.    bbs_node_info.doors_avail[0] = '-';
  2851.    bbs_node_info.doors_avail[1] = '1';
  2852.    bbs_node_info.eight_bits[0] = '-';
  2853.    bbs_node_info.eight_bits[1] = '1';
  2854.    bbs_node_info.upper_case[0] = ' ';
  2855.    bbs_node_info.upper_case[1] = '0';
  2856.    bbs_node_info.reserve_1[0] = ' ';
  2857.    bbs_node_info.reserve_1[1] = ' ';
  2858.    bbs_node_info.reserve_1[2] = ' ';
  2859.    bbs_node_info.reserve_1[3] = ' ';
  2860.    bbs_node_info.reserve_1[4] = ' ';
  2861.    bbs_node_info.sysop[0] = ' ';
  2862.    bbs_node_info.sysop[1] = '0';
  2863.    bbs_node_info.active[0] = 'A';
  2864.    bbs_node_info.reserved_2[0] = ' ';
  2865.    bbs_node_info.reserved_2[1] = ' ';
  2866.    bbs_node_info.reserved_3[0] = ' ';
  2867.    bbs_node_info.reserved_3[1] = ' ';
  2868.    bbs_node_info.reserved_3[2] = ' ';
  2869.    bbs_node_info.private_door[0] = ' ';
  2870.    bbs_node_info.private_door[1] = '0';
  2871.    bbs_node_info.transfer[0] = ' ';
  2872.    bbs_node_info.transfer[1] = ' ';
  2873.    strncpy(bbs_node_info.daily_exit_date, "01-01-1987", 10);
  2874.    strncpy(bbs_node_info.daily_exit_time, "01:00", 5);
  2875.    bbs_node_info.reliable[0] = '-';
  2876.    bbs_node_info.reliable[1] = '1';
  2877.    for(i = 0 ; i < 36 ; i++)
  2878.      bbs_node_info.reserved_4[i] = ' ';
  2879.  
  2880.  
  2881.    bbs_user_info.options.logins = 2;
  2882.    bbs_user_info.options.last_msg = 0;
  2883.    bbs_user_info.options.protocol[0] = ' ';
  2884.    bbs_user_info.options.margins = 0;
  2885.    bbs_user_info.options.subscription = 0;
  2886.    bbs_user_info.options.reserved[0] = ' ';
  2887.    for(i = 0 ; i < 24 ; i++)
  2888.      bbs_user_info.residence[i] = ' ';
  2889.    for(i = 0 ; i < 19 ; i++)
  2890.      bbs_user_info.reserved[i] = ' ';
  2891.    strncpy(bbs_user_info.last_on, "01-01-87 01:00", 14);
  2892.    for(i = 0 ; i < 3 ; i++)
  2893.      bbs_user_info.last_dir[i] = '\0';
  2894.    bbs_user_info.downloads = 0;
  2895.    bbs_user_info.uploads = 0;
  2896.    bbs_user_info.elapsed = 0;
  2897.  
  2898.  
  2899.    /*
  2900.     * Store users name
  2901.     */
  2902.  
  2903.     for(i = 0 ; i < 31 ; i++)                   /* Copy all 31 chars         */
  2904.       user_name[i] = bbs_node_info.name[i];
  2905.     user_name[31] = '\0';                       /* Null terminate it         */
  2906.  
  2907.  
  2908.    /*
  2909.     * Store security level
  2910.     */
  2911.  
  2912.    user_security  = bbs_user_info.security;
  2913.  
  2914.  
  2915.    /*
  2916.     * Store graphics type
  2917.     */
  2918.  
  2919.    string_data[0] = bbs_user_info.options.graphics[0]; /* Convert to number  */
  2920.    string_data[1] = '\0';
  2921.    user_graphics  = atoi(string_data);
  2922.  
  2923.  
  2924.    /*
  2925.     * Store nulls flag
  2926.     */
  2927.  
  2928.    if(bbs_user_info.options.bit_flags & BBS_OPTION_NULLS)
  2929.      user_nulls = 8;
  2930.    else
  2931.      user_nulls = 0;
  2932.  
  2933.  
  2934.    /*
  2935.     * Store caps flag
  2936.     */
  2937.  
  2938.    if(bbs_user_info.options.bit_flags & BBS_OPTION_CASE)
  2939.      user_caps = 1;
  2940.    else
  2941.      user_caps = 0;
  2942.  
  2943.  
  2944.    /*
  2945.     * Store page length
  2946.     */
  2947.  
  2948.    user_page = bbs_user_info.options.page_length;
  2949.  
  2950.  
  2951.    /*
  2952.     * Store timelimit
  2953.     */
  2954.  
  2955.    user_start   = cur_time();                   /* Remeber when we started   */
  2956.  
  2957.  
  2958.    /*
  2959.     * Exit
  2960.     */
  2961.  
  2962.    return(0);                                   /* Exit all ok               */
  2963.  
  2964. }
  2965.  
  2966.  
  2967. /******************************************************************************
  2968.  *
  2969.  * PAGE_OPERATOR - Page local operator
  2970.  *
  2971.  * process      1. If running local, exit
  2972.  *              2. Ring local bell
  2973.  *              3. Test for local input
  2974.  *              4. If local input, exit true
  2975.  *              5. Goto 2
  2976.  * input        None
  2977.  * output       Returns 1 if page answered
  2978.  *              Returns 0 if page not answered
  2979.  *****************************************************************************/
  2980.  
  2981. page_operator()
  2982. {
  2983. long    cur_time();
  2984.  
  2985. long    time_now;
  2986. int     normal_hours = 0;
  2987. int     i, j;
  2988. int     key;
  2989.  
  2990.    if(remote_user)
  2991.    {
  2992.      time_now = cur_time();                     /* Get current time          */
  2993.      if((time_now >= bbs_time_info.sysop_start) &&
  2994.         (time_now <= bbs_time_info.sysop_stop))
  2995.      {
  2996.        normal_hours = 1;
  2997.      }
  2998.  
  2999.      if(((normal_hours == 1) && (bbs_node_info.sysop_avail[1] == '1')) ||
  3000.         (bbs_node_info.sysop_annoy[1] == '1'))
  3001.      {
  3002.        for(i = 0 ; i < 10 ; i++)                /* Try 10 times              */
  3003.        {
  3004.          local_bell();                          /* Ring the bell             */
  3005.          print_char('.');                       /* Print a dot               */
  3006.          for(j = 0 ; j < 5000 ; j++)            /* Try a bunch of times      */
  3007.          {
  3008.            if(local_status())                   /* Test for response         */
  3009.            {
  3010.              if(local_input() == 0x1b)
  3011.              {
  3012.                print_string("\r\nSysOp in, go ahead...\r\n");
  3013.                return(1);                       /* Page answered if ESC      */
  3014.              }
  3015.            }
  3016.          }
  3017.        }
  3018.      }
  3019.    }
  3020.    return(0);                                   /* Exit, page unanswered     */
  3021. }
  3022.  
  3023.  
  3024. /******************************************************************************
  3025.  *
  3026.  * CHAT_MODE - Chat between local & remote
  3027.  *
  3028.  * process      1. If running local, exit
  3029.  *              2. Test status
  3030.  *              3. If nothing, goto 2
  3031.  *              4. Get the char
  3032.  *              5. If remote goto 8
  3033.  *              6. Test if ESC
  3034.  *              7. Exit if so
  3035.  *              8. Echo the character
  3036.  *              9. Goto 2
  3037.  * input        None
  3038.  * output       Returns 0
  3039.  *****************************************************************************/
  3040.  
  3041. chat_mode()
  3042. {
  3043. long    cur_time();
  3044. long    time1;
  3045. long    time2;
  3046. int     i, j;
  3047. int     key, keys;
  3048.  
  3049. char    dim[5];
  3050. char    bright[5];
  3051. int     current;
  3052.  
  3053. char    tbuff[80];
  3054. int     index;
  3055.  
  3056.  
  3057.    if(remote_user)                              /* If remote enable...       */
  3058.    {
  3059.      if(user_graphics == 2)                     /* If ANSI is enabled...     */
  3060.      {
  3061.        strcpy(dim, "");                     /* ...set the ANSI codes     */
  3062.        strcpy(bright, "");
  3063.      }
  3064.      else
  3065.      {
  3066.        strcpy(dim, "\0");                       /* ...set the null codes     */
  3067.        strcpy(bright, "\0");
  3068.      }
  3069.      current = -1;                              /* Set to undefined state    */
  3070.  
  3071.  
  3072.      time1 = cur_time();                        /* Save current time         */
  3073.      index = 0;
  3074.      while(1)                                   /* Do forever                */
  3075.      {
  3076.        keys = 0;
  3077.        while(keys == 0)                         /* Do until we get a key     */
  3078.          keys = io_status();
  3079.  
  3080.        if(keys == 1)                            /* If local input...         */
  3081.        {
  3082.          key = local_input();                   /* ...get keyboard char      */
  3083.          if(key == 0x1b)                        /* ...test if terminating    */
  3084.          {
  3085.            print_string("\r\nReturning to program...\r\n\r\n");
  3086.            time2 = cur_time();                  /* ...get time now           */
  3087.            if(time2 < time1)                    /* ...adjust if necessary    */
  3088.              time2 += DAY_SECONDS;
  3089.            time2 -= time1;                      /* ...compute time in CHAT   */
  3090.            user_signon  += time2;               /* ...adjust users time      */
  3091.            user_signoff += time2;
  3092.            return(0);                           /* ...exit if so             */
  3093.          }
  3094.        }
  3095.        else
  3096.          key = modem_input();                   /* Get modem char            */
  3097.  
  3098.        if(key != 0)
  3099.        {
  3100.          if(current != keys)                    /* If we need to change ints */
  3101.          {
  3102.            if(keys == 1)
  3103.              print_string(bright);              /* ...bright for SysOp       */
  3104.            else
  3105.              print_string(dim);                 /* ...dim for user           */
  3106.  
  3107.            current = keys;
  3108.          }
  3109.  
  3110.          print_char(key);                       /* else echo it              */
  3111.          if(key == 0x0d)                        /* if carriage return        */
  3112.          {
  3113.            print_char(0x0a);                    /* ...then echo line feed    */
  3114.            index = 0;                           /* ...and reset wrap index   */
  3115.          }
  3116.          else if(key == 0x08)                   /* if a backspace            */
  3117.          {
  3118.            if(index > 0)                        /* ...then adjust wrap index */
  3119.              index--;
  3120.          }
  3121.          else if(key >= ' ')                    /* if a printable character  */
  3122.          {
  3123.            tbuff[index] = key;                  /* ...then store it          */
  3124.            index++;                             /* ...and bump counter       */
  3125.  
  3126.            if(index == 79)                      /* if we need to word wrap   */
  3127.            {
  3128.              i = index - 1;                     /* start with last char      */
  3129.              while((i > 0) && (tbuff[i] != ' '))
  3130.                i--;
  3131.  
  3132.              if(i > 0)
  3133.              {
  3134.                j = index;                       /* backup to start of word   */
  3135.                while(j > i)
  3136.                {
  3137.                  print_char(0x08);
  3138.                  j--;
  3139.                }
  3140.  
  3141.                print_char(0x0d);                /* new line                  */
  3142.                print_char(0x0a);
  3143.  
  3144.                j++;                             /* now print what we have    */
  3145.                i = index;
  3146.                index = 0;
  3147.                while(j < i)
  3148.                {
  3149.                  print_char(tbuff[j]);
  3150.                  tbuff[index] = tbuff[j];
  3151.                  index++;
  3152.                  j++;
  3153.                }
  3154.              }
  3155.            }
  3156.          }
  3157.        }
  3158.      }
  3159.    }
  3160.    return(0);                                   /* Exit                      */
  3161. }
  3162.  
  3163.  
  3164.